View Javadoc

1   /*
2    *   Copyright (C) Christian Schulte, 2005-206
3    *   All rights reserved.
4    *
5    *   Redistribution and use in source and binary forms, with or without
6    *   modification, are permitted provided that the following conditions
7    *   are met:
8    *
9    *     o Redistributions of source code must retain the above copyright
10   *       notice, this list of conditions and the following disclaimer.
11   *
12   *     o Redistributions in binary form must reproduce the above copyright
13   *       notice, this list of conditions and the following disclaimer in
14   *       the documentation and/or other materials provided with the
15   *       distribution.
16   *
17   *   THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
18   *   INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
19   *   AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
20   *   THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY DIRECT, INDIRECT,
21   *   INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22   *   NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23   *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24   *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25   *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26   *   THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27   *
28   *   $JOMC: ModelValidationReport.java 4613 2012-09-22 10:07:08Z schulte $
29   *
30   */
31  package org.jomc.modlet;
32  
33  import java.io.Serializable;
34  import java.util.ArrayList;
35  import java.util.Collections;
36  import java.util.List;
37  import java.util.logging.Level;
38  import javax.xml.bind.JAXBElement;
39  
40  /**
41   * {@code Model} validation report.
42   *
43   * @author <a href="mailto:cs@schulte.it">Christian Schulte</a>
44   * @version $JOMC: ModelValidationReport.java 4613 2012-09-22 10:07:08Z schulte $
45   */
46  public class ModelValidationReport implements Serializable
47  {
48  
49      /** Report detail. */
50      public static class Detail implements Serializable
51      {
52  
53          /** Serial version UID for backwards compatibility with 1.0.x object streams. */
54          private static final long serialVersionUID = -2466230076806042116L;
55  
56          /**
57           * The detail identifier.
58           * @serial
59           */
60          private String identifier;
61  
62          /**
63           * The detail level.
64           * @serial
65           */
66          private Level level;
67  
68          /**
69           * The detail message.
70           * @serial
71           */
72          private String message;
73  
74          /**
75           * The JAXB element this detail is associated with.
76           * @serial
77           */
78          private JAXBElement<?> element;
79  
80          /**
81           * Creates a new {@code Detail} taking an identifier, a level, a message and an element.
82           *
83           * @param identifier The detail identifier.
84           * @param level The detail level.
85           * @param message The detail message.
86           * @param element The detail element.
87           */
88          public Detail( final String identifier, final Level level, final String message, final JAXBElement<?> element )
89          {
90              this.identifier = identifier;
91              this.level = level;
92              this.message = message;
93              this.element = element;
94          }
95  
96          /**
97           * Gets the identifier of this detail.
98           *
99           * @return The identifier of this detail or {@code null}.
100          */
101         public String getIdentifier()
102         {
103             return this.identifier;
104         }
105 
106         /**
107          * Gets the level of this detail.
108          *
109          * @return The level of this detail or {@code null}.
110          */
111         public Level getLevel()
112         {
113             return this.level;
114         }
115 
116         /**
117          * Gets the message of this detail.
118          *
119          * @return The message of this detail or {@code null}.
120          */
121         public String getMessage()
122         {
123             return this.message;
124         }
125 
126         /**
127          * Gets the JAXB element of this detail.
128          *
129          * @return The JAXB element of this detail or {@code null}.
130          */
131         public JAXBElement<?> getElement()
132         {
133             return this.element;
134         }
135 
136         /**
137          * Creates and returns a string representation of the object.
138          *
139          * @return A string representation of the object.
140          */
141         private String toStringInternal()
142         {
143             return new StringBuilder( 200 ).append( '{' ).
144                 append( "identifier=" ).append( this.getIdentifier() ).
145                 append( ", level=" ).append( this.getLevel().getLocalizedName() ).
146                 append( ", message=" ).append( this.getMessage() ).
147                 append( ", element=" ).append( this.getElement() ).append( '}' ).toString();
148 
149         }
150 
151         /**
152          * Creates and returns a string representation of the object.
153          *
154          * @return A string representation of the object.
155          */
156         @Override
157         public String toString()
158         {
159             return super.toString() + this.toStringInternal();
160         }
161 
162     }
163 
164     /** Serial version UID for backwards compatibility with 1.0.x object streams. */
165     private static final long serialVersionUID = 6688024709865043122L;
166 
167     /**
168      * Details of the instance.
169      * @serial
170      */
171     private List<Detail> details;
172 
173     /** Creates a new {@code ModelValidationReport} instance. */
174     public ModelValidationReport()
175     {
176         super();
177     }
178 
179     /**
180      * Gets all details of the instance.
181      * <p>This accessor method returns a reference to the live list, not a snapshot. Therefore any modification you make
182      * to the returned list will be present inside the object. This is why there is no {@code set} method for the
183      * details property.</p>
184      *
185      * @return All details of the instance.
186      */
187     public List<Detail> getDetails()
188     {
189         if ( this.details == null )
190         {
191             this.details = new ArrayList<Detail>();
192         }
193 
194         return this.details;
195     }
196 
197     /**
198      * Gets all details of the instance matching a given identifier.
199      *
200      * @param identifier The identifier of the details to return or {@code null}.
201      *
202      * @return An unmodifiable list containing all details of the instance matching {@code identifier}.
203      */
204     public List<Detail> getDetails( final String identifier )
205     {
206         final List<Detail> list = new ArrayList<Detail>( this.getDetails().size() );
207 
208         for ( int i = this.getDetails().size() - 1; i >= 0; i-- )
209         {
210             final Detail d = this.getDetails().get( i );
211             if ( identifier == null && d.getIdentifier() == null )
212             {
213                 list.add( d );
214             }
215             if ( identifier != null && identifier.equals( d.getIdentifier() ) )
216             {
217                 list.add( d );
218             }
219         }
220 
221         return Collections.unmodifiableList( list );
222     }
223 
224     /**
225      * Gets a flag indicating model validity.
226      *
227      * @return {@code true}, if all details are set to a level lower or equal to {@code WARNING}; {@code false}, if at
228      * least one detail is set to a level higher than {@code WARNING}.
229      *
230      * @see #getDetails()
231      */
232     public boolean isModelValid()
233     {
234         for ( int i = this.getDetails().size() - 1; i >= 0; i-- )
235         {
236             final Detail d = this.getDetails().get( i );
237             if ( d.getLevel() != null && d.getLevel().intValue() > Level.WARNING.intValue() )
238             {
239                 return false;
240             }
241         }
242 
243         return true;
244     }
245 
246 }