Coverage Report - javax.faces.application.FacesMessage
 
Classes in this File Line Coverage Branch Coverage Complexity
FacesMessage
96%
58/60
100%
6/6
1.333
FacesMessage$1
N/A
N/A
1.333
FacesMessage$Severity
100%
8/8
N/A
1.333
 
 1  
 /*
 2  
  * Licensed to the Apache Software Foundation (ASF) under one
 3  
  * or more contributor license agreements.  See the NOTICE file
 4  
  * distributed with this work for additional information
 5  
  * regarding copyright ownership.  The ASF licenses this file
 6  
  * to you under the Apache License, Version 2.0 (the
 7  
  * "License"); you may not use this file except in compliance
 8  
  * with the License.  You may obtain a copy of the License at
 9  
  *
 10  
  *   http://www.apache.org/licenses/LICENSE-2.0
 11  
  *
 12  
  * Unless required by applicable law or agreed to in writing,
 13  
  * software distributed under the License is distributed on an
 14  
  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 15  
  * KIND, either express or implied.  See the License for the
 16  
  * specific language governing permissions and limitations
 17  
  * under the License.
 18  
  */
 19  
 package javax.faces.application;
 20  
 
 21  
 import java.io.IOException;
 22  
 import java.io.ObjectInputStream;
 23  
 import java.io.ObjectOutputStream;
 24  
 import java.io.Serializable;
 25  
 import java.util.ArrayList;
 26  
 import java.util.Collections;
 27  
 import java.util.HashMap;
 28  
 import java.util.List;
 29  
 import java.util.Map;
 30  
 
 31  
 /**
 32  
  *see Javadoc of <a href="http://java.sun.com/javaee/javaserverfaces/1.2/docs/api/index.html">JSF Specification</a>
 33  
  *<p>
 34  
  * <code>FacesMessage</code> represents a single validation (or other) message, which is typically associated with a
 35  
  * particular component in the view. A {@link FacesMessage} instance may be created based on a specific messageId. The
 36  
  * specification defines the set of messageIds for which there must be {@link FacesMessage} instances.
 37  
  * </p>
 38  
  * 
 39  
  *<ui>The implementation must take the following steps when creating FacesMessage instances given a messageId: <li>Call
 40  
  * {@link Application#getMessageBundle()}. If <code>non-null</code>, locate the named <code>ResourceBundle</code>, using
 41  
  * the <code>Locale</code> from the current {@linkUIViewRoot} and see if it has a value for the argument
 42  
  * <code>messageId</code>. If it does, treat the value as the <code>summary</code> of the {@link FacesMessage}. If it
 43  
  * does not, or if {@link Application#getMessageBundle()} returned null, look in the ResourceBundle named by the value
 44  
  * of the constant {@link #FACES_MESSAGES} and see if it has a value for the argument messageId. If it does, treat the
 45  
  * value as the summary of the <code>FacesMessage</code>. If it does not, there is no initialization information for the
 46  
  * <code>FacesMessage</code> instance.</li> <li>In all cases, if a <code>ResourceBundle</code> hit is found for the
 47  
  * <code>{messageId}</code>, look for further hits under the key <code>{messageId}_detail</code>. Use this value, if
 48  
  * present, as the <code>detail</code> for the returned <code>FacesMessage</code>.</li> <li>Make sure to perform any
 49  
  * parameter substitution required for the <code>summary</code> and <code>detail</code> of the <code>FacesMessage</code>
 50  
  * .</li> </ui>
 51  
  * 
 52  
  */
 53  
 public class FacesMessage implements Serializable
 54  
 {
 55  
     private static final long serialVersionUID = 4851488727794169661L;
 56  
 
 57  
     /**
 58  
      * <code>ResourceBundle</code> identifier for messages whose message identifiers are defined in the JavaServer Faces
 59  
      * specification.
 60  
      */
 61  
     public static final String FACES_MESSAGES = "javax.faces.Messages";
 62  
 
 63  
     /**
 64  
      * Message severity level indicating an informational message rather than an error.
 65  
      */
 66  2
     public static final FacesMessage.Severity SEVERITY_INFO = new Severity("INFO", 0);
 67  
 
 68  
     /**
 69  
      * Message severity level indicating that an error might have occurred.
 70  
      */
 71  2
     public static final FacesMessage.Severity SEVERITY_WARN = new Severity("WARN", 1);
 72  
 
 73  
     /**
 74  
      * Message severity level indicating that an error has occurred.
 75  
      */
 76  2
     public static final FacesMessage.Severity SEVERITY_ERROR = new Severity("ERROR", 2);
 77  
 
 78  
     /**
 79  
      * Message severity level indicating that a serious error has occurred.
 80  
      */
 81  2
     public static final FacesMessage.Severity SEVERITY_FATAL = new Severity("FATAL", 3);
 82  
 
 83  
     /**
 84  
      * Immutable <code>Lis</code> of valid {@link FacesMessage.Severity}instances, in ascending order of their ordinal
 85  
      * value.
 86  
      */
 87  
     public static final List VALUES;
 88  
 
 89  
     /**
 90  
      * Immutable <code>Map</code> of valid {@link FacesMessage.Severity}instances, keyed by name.
 91  
      */
 92  
     public static final Map VALUES_MAP;
 93  
 
 94  
     static
 95  
     {
 96  2
         Map<String, FacesMessage.Severity> map = new HashMap<String, Severity>(7);
 97  2
         map.put(SEVERITY_INFO.toString(), SEVERITY_INFO);
 98  2
         map.put(SEVERITY_WARN.toString(), SEVERITY_WARN);
 99  2
         map.put(SEVERITY_ERROR.toString(), SEVERITY_ERROR);
 100  2
         map.put(SEVERITY_FATAL.toString(), SEVERITY_FATAL);
 101  2
         VALUES_MAP = Collections.unmodifiableMap(map);
 102  
 
 103  2
         List<FacesMessage.Severity> severityList = new ArrayList<Severity>(map.values());
 104  2
         Collections.sort(severityList); // the JSF spec requires it to be sorted
 105  2
         VALUES = Collections.unmodifiableList(severityList);
 106  2
     }
 107  
 
 108  
     private transient FacesMessage.Severity _severity;  // transient, b/c FacesMessage.Severity is not Serializable
 109  
     private String _summary;
 110  
     private String _detail;
 111  
     private boolean _rendered;
 112  
 
 113  
     /**
 114  
      *Construct a new {@link FacesMessage} with no initial values. The severity is set to Severity.INFO.
 115  
      */
 116  
     public FacesMessage()
 117  12
     {
 118  12
         _severity = SEVERITY_INFO;
 119  12
         _rendered = false;
 120  12
     }
 121  
 
 122  
     /**
 123  
      * Construct a new {@link FacesMessage} with just a summary. The detail is null, the severity is set to
 124  
      * <code>Severity.INFO</code>.
 125  
      */
 126  
     public FacesMessage(String summary)
 127  2
     {
 128  2
         _summary = summary;
 129  2
         _severity = SEVERITY_INFO;
 130  2
         _rendered = false;
 131  2
     }
 132  
 
 133  
     /**
 134  
      * Construct a new {@link FacesMessage} with the specified initial values. The severity is set to Severity.INFO.
 135  
      * 
 136  
      * @param summary
 137  
      *            - Localized summary message text
 138  
      * @param detail
 139  
      *            - Localized detail message text
 140  
      */
 141  
     public FacesMessage(String summary, String detail)
 142  4
     {
 143  4
         _summary = summary;
 144  4
         _detail = detail;
 145  4
         _severity = SEVERITY_INFO;
 146  4
         _rendered = false;
 147  4
     }
 148  
 
 149  
     /**
 150  
      * Construct a new {@link FacesMessage}with the specified initial values.
 151  
      * 
 152  
      * @param severity
 153  
      *            - the severity
 154  
      * @param summary
 155  
      *            - Localized summary message text
 156  
      * @param detail
 157  
      *            - Localized detail message text
 158  
      */
 159  
     public FacesMessage(FacesMessage.Severity severity, String summary, String detail)
 160  46
     {
 161  46
         if (severity == null)
 162  
         {
 163  2
             throw new NullPointerException("severity");
 164  
         }
 165  44
         _severity = severity;
 166  44
         _summary = summary;
 167  44
         _detail = detail;
 168  44
         _rendered = false;
 169  44
     }
 170  
 
 171  
     /**
 172  
      * 
 173  
      * @return
 174  
      */
 175  
     public FacesMessage.Severity getSeverity()
 176  
     {
 177  18
         return _severity;
 178  
     }
 179  
 
 180  
     /**
 181  
      * Return the severity level.
 182  
      */
 183  
     public void setSeverity(FacesMessage.Severity severity)
 184  
     {
 185  4
         if (severity == null)
 186  
         {
 187  2
             throw new NullPointerException("severity");
 188  
         }
 189  2
         _severity = severity;
 190  2
     }
 191  
 
 192  
     /**
 193  
      * Return the localized summary text.
 194  
      */
 195  
     public String getSummary()
 196  
     {
 197  36
         return _summary;
 198  
     }
 199  
 
 200  
     /**
 201  
      * Set the localized summary text.
 202  
      * 
 203  
      * @param summary
 204  
      *            - The new localized summary text
 205  
      */
 206  
     public void setSummary(String summary)
 207  
     {
 208  2
         _summary = summary;
 209  2
     }
 210  
 
 211  
     /**
 212  
      * 
 213  
      * @return
 214  
      */
 215  
     public String getDetail()
 216  
     {
 217  28
         if (_detail == null)
 218  
         {
 219  
             // Javadoc:
 220  
             // If no localized detail text has been defined for this message, return the localized summary text instead
 221  12
             return _summary;
 222  
         }
 223  16
         return _detail;
 224  
     }
 225  
 
 226  
     /**
 227  
      * Set the localized detail text.
 228  
      * 
 229  
      * @param detail
 230  
      *            - The new localized detail text
 231  
      */
 232  
     public void setDetail(String detail)
 233  
     {
 234  2
         _detail = detail;
 235  2
     }
 236  
 
 237  
     public boolean isRendered()
 238  
     {
 239  6
         return _rendered;
 240  
     }
 241  
 
 242  
     public void rendered()
 243  
     {
 244  0
         this._rendered = true;
 245  0
     }
 246  
 
 247  
     private void writeObject(ObjectOutputStream out) throws IOException
 248  
     {
 249  2
         out.defaultWriteObject();  // write summary, detail, rendered
 250  2
         out.writeInt(_severity._ordinal);  // FacesMessage.Severity is not Serializable, write ordinal only
 251  2
     }
 252  
 
 253  
     private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException
 254  
     {
 255  2
         in.defaultReadObject();  // read summary, detail, rendered
 256  
 
 257  
         // FacesMessage.Severity is not Serializable, read ordinal and get related FacesMessage.Severity
 258  2
         int severityOrdinal = in.readInt();
 259  2
         _severity = (Severity) VALUES.get(severityOrdinal);
 260  2
     }
 261  
 
 262  10
     public static class Severity implements Comparable
 263  
     {
 264  
         private String _name;
 265  
         private int _ordinal;
 266  
 
 267  
         private Severity(String name, int ordinal)
 268  8
         {
 269  8
             _name = name;
 270  8
             _ordinal = ordinal;
 271  8
         }
 272  
 
 273  
         public int getOrdinal()
 274  
         {
 275  72
             return _ordinal;
 276  
         }
 277  
 
 278  
         @Override
 279  
         public String toString()
 280  
         {
 281  16
             return _name;
 282  
         }
 283  
 
 284  
         public int compareTo(Object o)
 285  
         {
 286  32
             return getOrdinal() - ((Severity)o).getOrdinal();
 287  
         }
 288  
     }
 289  
 
 290  
 }