001 /* 002 * Copyright (c) 2009 The JOMC Project 003 * Copyright (c) 2005 Christian Schulte <cs@jomc.org> 004 * All rights reserved. 005 * 006 * Redistribution and use in source and binary forms, with or without 007 * modification, are permitted provided that the following conditions 008 * are met: 009 * 010 * o Redistributions of source code must retain the above copyright 011 * notice, this list of conditions and the following disclaimer. 012 * 013 * o Redistributions in binary form must reproduce the above copyright 014 * notice, this list of conditions and the following disclaimer in 015 * the documentation and/or other materials provided with the 016 * distribution. 017 * 018 * THIS SOFTWARE IS PROVIDED BY THE JOMC PROJECT AND CONTRIBUTORS "AS IS" 019 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 020 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 021 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE JOMC PROJECT OR 022 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 023 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 024 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 025 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 026 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 027 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 028 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 029 * 030 * $Id: ModelObjectValidationReport.java 891 2009-11-02 03:40:00Z schulte2005 $ 031 * 032 */ 033 package org.jomc.model; 034 035 import java.io.Serializable; 036 import java.util.ArrayList; 037 import java.util.Collections; 038 import java.util.List; 039 import java.util.logging.Level; 040 import javax.xml.bind.JAXBElement; 041 042 /** 043 * Validation report about a model object. 044 * 045 * @author <a href="mailto:cs@jomc.org">Christian Schulte</a> 046 * @version $Id: ModelObjectValidationReport.java 891 2009-11-02 03:40:00Z schulte2005 $ 047 */ 048 public class ModelObjectValidationReport implements Serializable 049 { 050 051 /** Report detail. */ 052 public static class Detail implements Serializable 053 { 054 055 /** Serial version UID for backwards compatibility with 1.0.x object streams. */ 056 private static final long serialVersionUID = 3602078739148823287L; 057 058 /** 059 * The detail identifier. 060 * @serial 061 */ 062 private String identifier; 063 064 /** 065 * The detail level. 066 * @serial 067 */ 068 private Level level; 069 070 /** 071 * The detail message. 072 * @serial 073 */ 074 private String message; 075 076 /** 077 * The JAXB element this detail is associated with. 078 * @serial 079 */ 080 private JAXBElement element; 081 082 /** 083 * Creates a new {@code Detail} taking an identifier, a level and a message. 084 * 085 * @param identifier The detail identifier. 086 * @param level The detail level. 087 * @param message The detail message. 088 */ 089 public Detail( final String identifier, final Level level, final String message ) 090 { 091 this.identifier = identifier; 092 this.level = level; 093 this.message = message; 094 } 095 096 /** 097 * Gets the identifier of this detail. 098 * 099 * @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 * Sets the JAXB element of this detail. 138 * 139 * @param value The new JAXB element of this detail or {@code null}. 140 */ 141 public void setElement( final JAXBElement value ) 142 { 143 this.element = value; 144 } 145 146 /** 147 * Creates and returns a string representation of the object. 148 * 149 * @return A string representation of the object. 150 */ 151 private String toStringInternal() 152 { 153 return new StringBuilder().append( '{' ). 154 append( "identifier=" ).append( this.getIdentifier() ). 155 append( ", level=" ).append( this.getLevel().getLocalizedName() ). 156 append( ", message=" ).append( this.getMessage() ). 157 append( ", element=" ).append( this.getElement() ).append( '}' ).toString(); 158 159 } 160 161 /** 162 * Creates and returns a string representation of the object. 163 * 164 * @return A string representation of the object. 165 */ 166 @Override 167 public String toString() 168 { 169 return super.toString() + this.toStringInternal(); 170 } 171 172 } 173 174 /** Serial version UID for backwards compatibility with 1.0.x object streams. */ 175 private static final long serialVersionUID = 5347328444554122366L; 176 177 /** 178 * The model object of the instance. 179 * @serial 180 */ 181 private JAXBElement modelObject; 182 183 /** 184 * Details of the instance. 185 * @serial 186 */ 187 private List<Detail> details; 188 189 /** 190 * Creates a new {@code ModelObjectValidationReport} instance taking a model object. 191 * 192 * @param modelObject The model object of the report. 193 */ 194 public ModelObjectValidationReport( final JAXBElement modelObject ) 195 { 196 this.modelObject = modelObject; 197 } 198 199 /** 200 * Gets the model object of the instance. 201 * 202 * @return The model object of the instance. 203 */ 204 public JAXBElement getModelObject() 205 { 206 return this.modelObject; 207 } 208 209 /** 210 * Gets all details of the instance. 211 * <p>This accessor method returns a reference to the live list, not a snapshot. Therefore any modification you make 212 * to the returned list will be present inside the object. This is why there is no {@code set} method for the 213 * details property.</p> 214 * 215 * 216 * @return All details of the instance. 217 */ 218 public List<Detail> getDetails() 219 { 220 if ( this.details == null ) 221 { 222 this.details = new ArrayList<Detail>(); 223 } 224 225 return this.details; 226 } 227 228 /** 229 * Gets all details of the instance matching a given identifier. 230 * 231 * @param identifier The identifier of the details to return or {@code null}. 232 * 233 * @return An unmodifiable list containing all details of the instance matching {@code identifier}. 234 */ 235 public List<Detail> getDetails( final String identifier ) 236 { 237 final List<Detail> list = new ArrayList( this.getDetails().size() ); 238 239 for ( Detail d : this.getDetails() ) 240 { 241 if ( identifier == null && d.getIdentifier() == null ) 242 { 243 list.add( d ); 244 } 245 if ( identifier != null && identifier.equals( d.getIdentifier() ) ) 246 { 247 list.add( d ); 248 } 249 } 250 251 return Collections.unmodifiableList( list ); 252 } 253 254 /** 255 * Gets a flag indicating if the model object of the instance is considered valid. 256 * 257 * @return {@code true} if the model object of the instance is considered valid; {@code false} if the model object 258 * of the instance is considered invalid. 259 */ 260 public boolean isModelObjectValid() 261 { 262 for ( Detail d : this.getDetails() ) 263 { 264 if ( d.getLevel() != null && d.getLevel().intValue() > Level.WARNING.intValue() ) 265 { 266 return false; 267 } 268 } 269 270 return true; 271 } 272 273 }