er.extensions.components.ERXErrorDictionaryPanel.java Source code

Java tutorial

Introduction

Here is the source code for er.extensions.components.ERXErrorDictionaryPanel.java

Source

/*
 * Copyright (C) NetStruxr, Inc. All rights reserved.
 *
 * This software is published under the terms of the NetStruxr
 * Public Software License version 0.5, a copy of which has been
 * included with this distribution in the LICENSE.NPL file.  */
package er.extensions.components;

import java.util.Enumeration;

import org.apache.commons.lang.StringUtils;

import com.webobjects.appserver.WOContext;
import com.webobjects.appserver.WOResponse;
import com.webobjects.foundation.NSArray;
import com.webobjects.foundation.NSMutableArray;
import com.webobjects.foundation.NSMutableDictionary;

import er.extensions.eof.ERXEnterpriseObject;
import er.extensions.localization.ERXLocalizer;

/**
 * Useful for displaying a dictionary of caught exception messages.<br />
 * 
 * @binding errorMessages An NSMutableDictionary that contains the list of errors to display
 * @binding extraErrorMessage An String containing an error. If errorMessages is also set, 
 *       extraErrorMessage will be added below errorMessages
 * @binding shouldShowNewLineAbove An Boolean, if true, will add a new empty line above 
 *       the list of errors
 * @binding shouldShowNewLineBelow An Boolean, if true, will add a new empty line below 
 *       the list of errors
 * @binding errorKeyOrder An NSMutableArray containing a list of string keys to sort
 *       the errorMessages list
 */

public class ERXErrorDictionaryPanel extends ERXStatelessComponent {
    /**
     * Do I need to update serialVersionUID?
     * See section 5.6 <cite>Type Changes Affecting Serialization</cite> on page 51 of the 
     * <a href="http://java.sun.com/j2se/1.4/pdf/serial-spec.pdf">Java Object Serialization Spec</a>
     */
    private static final long serialVersionUID = 1L;

    protected NSMutableDictionary errorMessages;
    protected NSMutableArray errorKeyOrder;
    protected String extraErrorMessage;

    public String errorKey;

    public ERXErrorDictionaryPanel(WOContext aContext) {
        super(aContext);
    }

    public NSMutableDictionary errorMessages() {
        if (errorMessages == null) {
            errorMessages = (NSMutableDictionary) valueForBinding("errorMessages");
            if (errorMessages == null) {
                errorMessages = new NSMutableDictionary();
            }
        }
        return errorMessages;
    }

    public NSMutableArray errorKeyOrder() {
        if (errorKeyOrder == null)
            errorKeyOrder = (NSMutableArray) valueForBinding("errorKeyOrder");
        return errorKeyOrder;
    }

    //protected String errorMessageItem;
    public String extraErrorMessage() {
        if (extraErrorMessage == null)
            extraErrorMessage = (String) valueForBinding("extraErrorMessage");
        return extraErrorMessage;
    }
    //public boolean shouldShowNewLineAbove;
    //public boolean shouldShowNewLineBelow;

    public boolean hasErrors() {
        boolean hasErrors = false;
        hasErrors = errorMessages().count() > 0
                || (extraErrorMessage() != null && extraErrorMessage().length() > 0);
        return hasErrors;
    }

    public NSArray errorKeys() {
        return errorKeyOrder() != null ? errorKeyOrder() : errorMessages().allKeys();
    }

    public String errorMessageItem() {
        return (String) errorMessages().objectForKey(errorKey);
    }

    private final static String eliminable = "Could not save your changes: null";
    private final static String couldNotSave = "Could not save your changes: ";

    public static String massageErrorMessage(String initialMessage, String displayErrorKey) {
        String result = StringUtils.replace(initialMessage, "EOValidationException:", "");
        if (displayErrorKey != null) {
            result = StringUtils.replace(result, ERXEnterpriseObject.KEY_MARKER, displayErrorKey);
        }

        if (result != null) {
            if (result.endsWith("is not allowed to be null.")
                    || (result.startsWith(" The ") && result.indexOf(" property ") != -1
                            && result.indexOf(" must have a ") != -1 && result.endsWith(" assigned"))) {
                char c;
                if (displayErrorKey == null) {
                    result = result.substring(result.indexOf("'") + 1,
                            result.indexOf("is not allowed to be null.") - 2);
                    c = result.charAt(0);
                } else {
                    result = displayErrorKey;
                    c = result.toLowerCase().charAt(0);
                }
                String article = (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u') ? "an" : "a";
                result = "Please provide " + article + " <b>" + result + "</b>.";
            } else if (result.indexOf(": Invalid number") != -1) {
                int colon = result.indexOf(':');
                result = "<b>" + (displayErrorKey == null ? result.substring(0, colon - 1) : displayErrorKey);
                result += "</b>: I could not understand the number you typed.";
            } else if (result.indexOf(eliminable) > 0) {
                result = result.substring(eliminable.length() + 1, result.length());
            }
            if (result.indexOf(couldNotSave) > 0) {
                String replace = (String) ERXLocalizer.currentLocalizer().valueForKey(couldNotSave);
                if (replace != null)
                    result = replace + result.substring(couldNotSave.length() + 1, result.length());
            }
        }
        return result;
    }

    public Object value;

    @Override
    public void reset() {
        super.reset();
        errorMessages = null;
        errorKeyOrder = null;
        extraErrorMessage = null;
    }

    @Override
    public void appendToResponse(WOResponse r, WOContext c) {
        // this is a little silly but has the advantage of minimizing impact
        // on other pieces of code
        for (Enumeration e = errorMessages().keyEnumerator(); e.hasMoreElements();) {
            String key = (String) e.nextElement();
            String errorMessageValue = (String) errorMessages().objectForKey(key);
            errorMessages().setObjectForKey(massageErrorMessage(errorMessageValue, key), key);
        }
        extraErrorMessage = massageErrorMessage(extraErrorMessage(), null);
        super.appendToResponse(r, c);
    }
}