+ /**
+ * Container class that collects all warnings and errors that occured during
+ * {@link ProjectInserter#validateProject(Project) project validation}.
+ *
+ * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
+ */
+ public static class CheckReport implements Iterable<Issue> {
+
+ /** The issures that occured. */
+ private final List<Issue> issues = new ArrayList<Issue>();
+
+ /**
+ * Adds an issue.
+ *
+ * @param issue
+ * The issue to add
+ */
+ public void addIssue(Issue issue) {
+ issues.add(issue);
+ }
+
+ /**
+ * Creates an {@link Issue} from the given error key and fatality flag
+ * and {@link #addIssue(Issue) adds} it.
+ *
+ * @param errorKey
+ * The error key
+ * @param fatal
+ * {@code true} if the error is fatal, {@code false} if only
+ * a warning should be generated
+ * @param parameters
+ * Any additional parameters
+ */
+ public void addIssue(String errorKey, boolean fatal, String... parameters) {
+ addIssue(new Issue(errorKey, fatal, parameters));
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public Iterator<Issue> iterator() {
+ return issues.iterator();
+ }
+
+ /**
+ * Returns whether this check report does not contain any errors.
+ *
+ * @return {@code true} if this check report does not contain any
+ * errors, {@code false} if this check report does contain
+ * errors
+ */
+ public boolean isEmpty() {
+ return issues.isEmpty();
+ }
+
+ /**
+ * Returns the number of issues in this check report.
+ *
+ * @return The number of issues
+ */
+ public int size() {
+ return issues.size();
+ }
+
+ /**
+ * Container class for a single issue. An issue contains an error key
+ * that describes the error, and a fatality flag that determines whether
+ * the insert has to be aborted (if the flag is {@code true}) or if it
+ * can still be performed and only a warning should be generated (if the
+ * flag is {@code false}).
+ *
+ * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’
+ * Roden</a>
+ */
+ public static class Issue {
+
+ /** The error key. */
+ private final String errorKey;
+
+ /** The fatality flag. */
+ private final boolean fatal;
+
+ /** Additional parameters. */
+ private String[] parameters;
+
+ /**
+ * Creates a new issue.
+ *
+ * @param errorKey
+ * The error key
+ * @param fatal
+ * The fatality flag
+ * @param parameters
+ * Any additional parameters
+ */
+ protected Issue(String errorKey, boolean fatal, String... parameters) {
+ this.errorKey = errorKey;
+ this.fatal = fatal;
+ this.parameters = parameters;
+ }
+
+ /**
+ * Returns the key of the encountered error.
+ *
+ * @return The error key
+ */
+ public String getErrorKey() {
+ return errorKey;
+ }
+
+ /**
+ * Returns whether the issue is fatal and the insert has to be
+ * aborted. Otherwise only a warning should be shown.
+ *
+ * @return {@code true} if the insert needs to be aborted, {@code
+ * false} otherwise
+ */
+ public boolean isFatal() {
+ return fatal;
+ }
+
+ /**
+ * Returns any additional parameters.
+ *
+ * @return The additional parameters
+ */
+ public String[] getParameters() {
+ return parameters;
+ }
+
+ }
+
+ }
+