2009/05/20 - Apache Shale has been retired.

For more information, please explore the Attic.

Coverage Report - org.apache.shale.validator.util.AbstractUtilities
 
Classes in this File Line Coverage Branch Coverage Complexity
AbstractUtilities
100%
18/18
N/A
2.222
 
 1  
 /*
 2  
  * Licensed to the Apache Software Foundation (ASF) under one or more
 3  
  * contributor license agreements.  See the NOTICE file distributed with
 4  
  * this work for additional information regarding copyright ownership.
 5  
  * The ASF licenses this file to you under the Apache License, Version 2.0
 6  
  * (the "License"); you may not use this file except in compliance with
 7  
  * the License.  You may obtain a copy of the License at
 8  
  *
 9  
  *      http://www.apache.org/licenses/LICENSE-2.0
 10  
  *
 11  
  * Unless required by applicable law or agreed to in writing, software
 12  
  * distributed under the License is distributed on an "AS IS" BASIS,
 13  
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 14  
  * See the License for the specific language governing permissions and
 15  
  * limitations under the License.
 16  
  */
 17  
 
 18  
 package org.apache.shale.validator.util;
 19  
 
 20  
 import java.text.MessageFormat;
 21  
 import java.util.Locale;
 22  
 import java.util.MissingResourceException;
 23  
 import java.util.ResourceBundle;
 24  
 import javax.faces.component.StateHolder;
 25  
 import javax.faces.context.FacesContext;
 26  
 
 27  
 /**
 28  
  * <p>Abstract base class for converters and validators that use Apache Commons
 29  
  * Validator as their foundation.  This class provides common utility methods
 30  
  * for concrete converter and validator implementations.</p>
 31  
  */
 32  70
 public abstract class AbstractUtilities implements StateHolder {
 33  
 
 34  
 
 35  
     // ------------------------------------------------------------ Constructors
 36  
 
 37  
 
 38  
     // ------------------------------------------------------ Manifest Constants
 39  
 
 40  
 
 41  
     /**
 42  
      * <p>Name of the resource bundle containing default message strings.</p>
 43  
      */
 44  
     public static final String DEFAULT_RESOURCE_BUNDLE =
 45  
             "org.apache.shale.validator.resources.Bundle";
 46  
 
 47  
 
 48  
     // -------------------------------------------------------------- Properties
 49  
 
 50  
 
 51  
     /**
 52  
      * <p>Custom error message template, if any.</p>
 53  
      */
 54  70
     private String message = null;
 55  
 
 56  
 
 57  
     /**
 58  
      * <p>Return the custom error message template for this converter or
 59  
      * validator, if any.  If not defined, a standard error message template
 60  
      * will be used instead.</p>
 61  
      */
 62  
     public String getMessage() {
 63  25
         return this.message;
 64  
     }
 65  
 
 66  
 
 67  
     /**
 68  
      * <p>Set the custom error message template for this validator.</p>
 69  
      *
 70  
      * @param message The new custom error message template, or <code>null</code>
 71  
      *  to select the standard template
 72  
      */
 73  
     public void setMessage(String message) {
 74  
         this.message = message;
 75  
     }
 76  
 
 77  
 
 78  
     // ----------------------------------------------------- StateHolder Methods
 79  
 
 80  
 
 81  
     /** {@inheritDoc} */
 82  
     public void restoreState(FacesContext context, Object state) {
 83  
         Object[] values = (Object[]) state;
 84  
         this.message = (String) values[0];
 85  
     }
 86  
 
 87  
 
 88  
     /** {@inheritDoc} */
 89  
     public Object saveState(FacesContext context) {
 90  
         Object[] values = new Object[1];
 91  
         values[1] = this.message;
 92  
         return values;
 93  
     }
 94  
 
 95  
 
 96  70
     private boolean transientValue = false;
 97  
 
 98  
 
 99  
     /** {@inheritDoc} */
 100  
     public boolean isTransient() {
 101  
         return this.transientValue;
 102  
     }
 103  
 
 104  
 
 105  
     /** {@inheritDoc} */
 106  
     public void setTransient(boolean transientValue) {
 107  
         this.transientValue = transientValue;
 108  
     }
 109  
 
 110  
 
 111  
     // ---------------------------------------------------------- Object Methods
 112  
 
 113  
 
 114  
     // ------------------------------------------------------- Protected Methods
 115  
 
 116  
 
 117  
     /**
 118  
      * <p>Return a locale-sensitive message for this converter or
 119  
      * validator.  The following algorithm is applied to select the
 120  
      * appropriate message:</p>
 121  
      * <ul>
 122  
      * <li>If the <code>message</code> property has been set, use
 123  
      *     that value explicitly</li>
 124  
      * <li>If the application specifies a message resource bundle,
 125  
      *     and this resource bundle includes a value for the specified
 126  
      *     key, use that value</li>
 127  
      * <li>If the default message resource bundle for this module
 128  
      *     includes a value for the specified key, use that value</li>
 129  
      * <li>Create and return a dummy value</li>
 130  
      * </ul>
 131  
      *
 132  
      * @param context <code>FaceContext</code> for the current request
 133  
      * @param key Message key for the requested message
 134  
      */
 135  
     protected String message(FacesContext context, String key) {
 136  
 
 137  
         // Return any explicitly specified message
 138  25
         String message = getMessage();
 139  25
         if (message != null) {
 140  
             return message;
 141  
         }
 142  
 
 143  
         // Set up variables we will need
 144  25
         ResourceBundle bundle = null;
 145  25
         Locale locale = context.getViewRoot().getLocale();
 146  25
         ClassLoader loader = Thread.currentThread().getContextClassLoader();
 147  
 
 148  
         // Search for a match in the application resource bundle (if any)
 149  25
         String name = context.getApplication().getMessageBundle();
 150  25
         if (name != null) {
 151  
             bundle = ResourceBundle.getBundle(name, locale, loader);
 152  
             if (bundle != null) {
 153  
                 try {
 154  
                     message = bundle.getString(key);
 155  
                 } catch (MissingResourceException e) {
 156  
                     message = null;
 157  
                 }
 158  
                 if (message != null) {
 159  
                     return message;
 160  
                 }
 161  
             }
 162  
         }
 163  
 
 164  
         // Otherwise, search the default resource bundle
 165  25
         bundle = ResourceBundle.getBundle(DEFAULT_RESOURCE_BUNDLE, locale, loader);
 166  
         try {
 167  25
             return bundle.getString(key);
 168  
         } catch (MissingResourceException e) {
 169  
             return "???" + key + "???";
 170  
         }
 171  
 
 172  
     }
 173  
 
 174  
 
 175  
     /**
 176  
      * <p>Retrieve a locale-specific message for the specified key, then
 177  
      * treat it as a message format pattern, and substitute in the specified
 178  
      * parameter values and return the resulting string.</p>
 179  
      *
 180  
      * @param context <code>FaceContext</code> for the current request
 181  
      * @param key Message key for the requested message
 182  
      * @param parameters Replacement parameters to substitute in to
 183  
      *  the retrieved message
 184  
      */
 185  
     protected String message(FacesContext context, String key,
 186  
                              Object[] parameters) {
 187  
 
 188  20
         String message = message(context, key);
 189  20
         if ((parameters == null) || (parameters.length < 1)) {
 190  
             return message;
 191  
         }
 192  20
         return message(context.getViewRoot().getLocale(), message, parameters);
 193  
 
 194  
     }
 195  
 
 196  
 
 197  
     /**
 198  
      * <p>Use the specified message as a message format pattern, substitute
 199  
      * in the specified parameter values, and return the resulting string.</p>
 200  
      *
 201  
      * @param locale Locale for performing parameter replacement
 202  
      * @param message Message format pattern string
 203  
      * @param parameters Replacement parameters to substitute in to
 204  
      *  the message format pattern
 205  
      */
 206  
     protected String message(Locale locale, String message, Object[] parameters) {
 207  
 
 208  20
         MessageFormat format =
 209  
           new MessageFormat(message, locale);
 210  20
         return format.format(parameters);
 211  
 
 212  
     }
 213  
 
 214  
 
 215  
 }