All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.myfaces.validator.ValidatorBase Maven / Gradle / Ivy

Go to download

JSF components and utilities that can be used with any JSF implementation. This library is compatible with both JSF1.1 and JSF1.2; however for JSF1.2 users there is an alternative build of Tomahawk available that takes advantage of JSF1.2 features to offer some additional benefits.

There is a newer version: 1.1.14
Show newest version
/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
package org.apache.myfaces.validator;

import java.util.*;
import java.io.Serializable;

import javax.faces.application.FacesMessage;
import javax.faces.component.StateHolder;
import javax.faces.context.FacesContext;
import javax.faces.validator.Validator;
import javax.faces.el.ValueBinding;

import org.apache.myfaces.shared_tomahawk.util.MessageUtils;
import org.apache.myfaces.shared_tomahawk.util._ComponentUtils;
import org.apache.myfaces.tomahawk.util.Constants;

/**
 * Base validator implementation for Tomahawk validators.
 *
 * @JSFValidator
 *   configExcluded = "true"
 *   tagClass = "org.apache.myfaces.validator.ValidatorBaseTag"
 *   tagHandler = "org.apache.myfaces.validator.ValidatorBaseTagHandler"
 */
public abstract class ValidatorBase implements StateHolder, Validator {

    private String _summaryMessage = null;
    private String _detailMessage = null;
    private boolean _transient = false;

    /**
     * alternate validation error summary message format string
     * 
     * @JSFProperty
     * @return  The summary message to be displayed
     */
    public String getSummaryMessage()
    {
        if (_summaryMessage != null) return _summaryMessage;
        ValueBinding vb = getValueBinding("summaryMessage");
        return vb != null ? _ComponentUtils.getStringValue(getFacesContext(), vb) : null;
    }

    /**
     * 
     * @param message   The summary message to be displayed.
     */
    public void setSummaryMessage(String message) {
        _summaryMessage = message;
    }

    /**
     * alternate validation error detail message format string 
     * (use 'message' and 'detailMessage' alternatively)
     * 
     * @JSFProperty
     * @return  The message.
     * @deprecated Use getDetailMessage()
     */
    public String getMessage() {
        return getDetailMessage();
    }

    /**
     * 
     * @param message  The detail message to be displayed.
     * @deprecated Use setDetailMessage()
     */
    public void setMessage(String message) {
        setDetailMessage(message);
    }


    /**
     * alternate validation error detail message format string 
     * (use 'message' and 'detailMessage' alternatively)
     *
     * @JSFProperty
     * @return  The detail message.
     */
    public String getDetailMessage() {
        if (_detailMessage != null) return _detailMessage;
        ValueBinding vb = getValueBinding("detailMessage");
        return vb != null ? _ComponentUtils.getStringValue(getFacesContext(), vb) : null;
    }

    /**
     *
     * @param message  The detail message to be displayed.
     */
    public void setDetailMessage(String message) {
        _detailMessage = message;
    }


    /**
     * @param context
     */
    public Object saveState(FacesContext context) {
        Object[] state = new Object[3];
        state[0] = _summaryMessage;
        state[1] = _detailMessage;
        state[2] = saveValueBindingMap(context);
        return state;
    }

    public void restoreState(FacesContext context, Object state) {
        Object[] values = (Object[]) state;
        _summaryMessage = (String) values[0];
        _detailMessage = (String) values[1];
        restoreValueBindingMap(context, values[2]);
    }

    public boolean isTransient() {
        return _transient;
    }

    public void setTransient(boolean newTransientValue) {
        _transient = newTransientValue;
    }

    // Utility methods

    /**
     * @param defaultMessage The default message we would expect.
     * @param args Arguments for parsing this message.
     * @return FacesMessage
     */
    protected FacesMessage getFacesMessage(String defaultMessage, Object[] args) {
        FacesMessage msg;

        if (getSummaryMessage() == null && getDetailMessage() == null)
        {
            msg = MessageUtils.getMessage(Constants.TOMAHAWK_DEFAULT_BUNDLE, FacesMessage.SEVERITY_ERROR, defaultMessage, args);
        } else {
            Locale locale = MessageUtils.getCurrentLocale();
            String summaryText = MessageUtils.substituteParams(locale, getSummaryMessage(), args);
            String detailText = MessageUtils.substituteParams(locale, getDetailMessage(), args);
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, summaryText, detailText);
        }
        return msg;
    }

    // --------------------- borrowed from UIComponentBase ------------

    private Map _valueBindingMap = null;

    public ValueBinding getValueBinding(String name)
    {
        if (name == null) throw new NullPointerException("name");
        if (_valueBindingMap == null)
        {
            return null;
        }
        else
        {
            return (ValueBinding)_valueBindingMap.get(name);
        }
    }

    public void setValueBinding(String name,
                                ValueBinding binding)
    {
        if (name == null) throw new NullPointerException("name");
        if (_valueBindingMap == null)
        {
            _valueBindingMap = new HashMap();
        }
        _valueBindingMap.put(name, binding);
    }

    private Object saveValueBindingMap(FacesContext context)
    {
        if (_valueBindingMap != null)
        {
            int initCapacity = (_valueBindingMap.size() * 4 + 3) / 3;
            HashMap stateMap = new HashMap(initCapacity);
            for (Iterator it = _valueBindingMap.entrySet().iterator(); it.hasNext(); )
            {
                Map.Entry entry = (Map.Entry)it.next();
                stateMap.put(entry.getKey(),
                             saveAttachedState(context, entry.getValue()));
            }
            return stateMap;
        }
        else
        {
            return null;
        }
    }

    private void restoreValueBindingMap(FacesContext context, Object stateObj)
    {
        if (stateObj != null)
        {
            Map stateMap = (Map)stateObj;
            int initCapacity = (stateMap.size() * 4 + 3) / 3;
            _valueBindingMap = new HashMap(initCapacity);
            for (Iterator it = stateMap.entrySet().iterator(); it.hasNext(); )
            {
                Map.Entry entry = (Map.Entry)it.next();
                _valueBindingMap.put(entry.getKey(),
                                     restoreAttachedState(context, entry.getValue()));
            }
        }
        else
        {
            _valueBindingMap = null;
        }
    }

    /**
     * Serializes objects which are "attached" to this component but which are
     * not UIComponent children of it. Examples are validator and listener
     * objects. To be precise, it returns an object which implements
     * java.io.Serializable, and which when serialized will persist the
     * state of the provided object.
     * 

* If the attachedObject is a List then every object in the list is saved * via a call to this method, and the returned wrapper object contains * a List object. *

* If the object implements StateHolder then the object's saveState is * called immediately, and a wrapper is returned which contains both * this saved state and the original class name. However in the case * where the StateHolder.isTransient method returns true, null is * returned instead. *

* If the object implements java.io.Serializable then the object is simply * returned immediately; standard java serialization will later be used * to store this object. *

* In all other cases, a wrapper is returned which simply stores the type * of the provided object. When deserialized, a default instance of that * type will be recreated. */ public static Object saveAttachedState(FacesContext context, Object attachedObject) { if (attachedObject == null) return null; if (attachedObject instanceof List) { List lst = new ArrayList(((List)attachedObject).size()); for (Iterator it = ((List)attachedObject).iterator(); it.hasNext(); ) { lst.add(saveAttachedState(context, it.next())); } return new AttachedListStateWrapper(lst); } else if (attachedObject instanceof StateHolder) { if (((StateHolder)attachedObject).isTransient()) { return null; } else { return new AttachedStateWrapper(attachedObject.getClass(), ((StateHolder)attachedObject).saveState(context)); } } else if (attachedObject instanceof Serializable) { return attachedObject; } else { return new AttachedStateWrapper(attachedObject.getClass(), null); } } public static Object restoreAttachedState(FacesContext context, Object stateObj) throws IllegalStateException { if (context == null) throw new NullPointerException("context"); if (stateObj == null) return null; if (stateObj instanceof AttachedListStateWrapper) { List lst = ((AttachedListStateWrapper)stateObj).getWrappedStateList(); List restoredList = new ArrayList(lst.size()); for (Iterator it = lst.iterator(); it.hasNext(); ) { restoredList.add(restoreAttachedState(context, it.next())); } return restoredList; } else if (stateObj instanceof AttachedStateWrapper) { Class clazz = ((AttachedStateWrapper)stateObj).getClazz(); Object restoredObject; try { restoredObject = clazz.newInstance(); } catch (InstantiationException e) { throw new RuntimeException("Could not restore StateHolder of type " + clazz.getName() + " (missing no-args constructor?)", e); } catch (IllegalAccessException e) { throw new RuntimeException(e); } if (restoredObject instanceof StateHolder) { Object wrappedState = ((AttachedStateWrapper)stateObj).getWrappedStateObject(); ((StateHolder)restoredObject).restoreState(context, wrappedState); } return restoredObject; } else { return stateObj; } } protected FacesContext getFacesContext() { return FacesContext.getCurrentInstance(); } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy