View Javadoc

1   /* This file is part of the project "Hilbert II" - http://www.qedeq.org" target="alexandria_uri">http://www.qedeq.org
2    *
3    * Copyright 2000-2014,  Michael Meyling <mime@qedeq.org>.
4    *
5    * "Hilbert II" is free software; you can redistribute
6    * it and/or modify it under the terms of the GNU General Public
7    * License as published by the Free Software Foundation; either
8    * version 2 of the License, or (at your option) any later version.
9    *
10   * This program is distributed in the hope that it will be useful,
11   * but WITHOUT ANY WARRANTY; without even the implied warranty of
12   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13   * GNU General Public License for more details.
14   */
15  
16  package org.qedeq.kernel.se.common;
17  
18  import org.qedeq.base.utility.EqualsUtility;
19  
20  /**
21   * Data validation error for a QEDEQ module. An error has always a reference to its
22   * location. Maybe an additional reference for another location is provided.
23   * <br/>
24   * An error code, message and location should fix a certain data validation error, so only these
25   * informations are used for {@link #hashCode()} and {@link #equals(Object)}.
26   *
27   * @author  Michael Meyling
28   */
29  public abstract class ModuleDataException extends QedeqException {
30  
31      /** Error location. */
32      private final ModuleContext context;
33  
34      /** Reference location to explain the error. */
35      private final ModuleContext referenceContext;
36  
37      /**
38       * Constructor.
39       *
40       * @param   errorCode   Error code of this message.
41       * @param   message     Error message.
42       * @param   context     Error location.
43       * @param   referenceContext  Reference location.
44       * @param   cause       Detailed exception information.
45       */
46      public ModuleDataException(final int errorCode, final String message,
47              final ModuleContext context, final ModuleContext referenceContext,
48              final Exception cause) {
49          super(errorCode, message, cause);
50          // use copy constructor
51          this.context = (context == null ? null : new ModuleContext(context));
52          this.referenceContext = (referenceContext == null ? null
53                  : new ModuleContext(referenceContext));
54      }
55  
56      /**
57       * Constructor.
58       *
59       * @param   errorCode   Error code of this message.
60       * @param   message     Error message.
61       * @param   context     Error location.
62       * @param   referenceContext  Reference location.
63       */
64      public ModuleDataException(final int errorCode, final String message,
65              final ModuleContext context, final ModuleContext referenceContext) {
66          super(errorCode, message);
67          // use copy constructor
68          this.context = (context == null ? null : new ModuleContext(context));
69          this.referenceContext = (referenceContext == null ? null
70                  : new ModuleContext(referenceContext));
71      }
72  
73      /**
74       * Constructor.
75       *
76       * @param   errorCode   Error code of this message.
77       * @param   message     Error message.
78       * @param   context     Error location.
79       * @param   cause       Detailed exception information.
80       */
81      public ModuleDataException(final int errorCode, final String message,
82              final ModuleContext context, final Exception cause) {
83          super(errorCode, message, cause);
84          // use copy constructor
85          this.context = (context == null ? null : new ModuleContext(context));
86          this.referenceContext = null;
87      }
88  
89      /**
90       * Constructor. Copies module context, so original can be changed.
91       *
92       * @param   errorCode   Error code of this message.
93       * @param   message     Error message.
94       * @param   context     Error location.
95       */
96      public ModuleDataException(final int errorCode, final String message,
97              final ModuleContext context) {
98          super(errorCode, message);
99          // use copy constructor
100         this.context = (context == null ? null : new ModuleContext(context));
101         this.referenceContext = null;
102     }
103 
104     /**
105      * Get context information about error location.
106      *
107      * @return  Error location context.
108      */
109     public final ModuleContext getContext() {
110         return context;
111     }
112 
113     /**
114      * Get additional context information about another associated location.
115      *
116      * @return  Additional error location context.
117      */
118     public final ModuleContext getReferenceContext() {
119         return referenceContext;
120     }
121 
122     public final int hashCode() {
123         return getErrorCode() ^ context.hashCode() ^ getMessage().hashCode();
124     }
125 
126     public final boolean equals(final Object obj) {
127         if (!(obj instanceof ModuleDataException)) {
128             return false;
129         }
130         final ModuleDataException other = (ModuleDataException) obj;
131         return  (getErrorCode() == other.getErrorCode())
132             && EqualsUtility.equals(getMessage(), other.getMessage())
133             && EqualsUtility.equals(context, other.context);
134     }
135 
136 
137 }