com.icesoft.faces.util.CoreUtils.java Source code

Java tutorial

Introduction

Here is the source code for com.icesoft.faces.util.CoreUtils.java

Source

/*
 * Copyright 2004-2013 ICEsoft Technologies Canada Corp.
 *
 * Licensed 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 com.icesoft.faces.util;

import java.lang.reflect.Method;
import java.util.Iterator;
import java.io.Serializable;

import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.component.UIInput;
import javax.faces.context.FacesContext;
import javax.faces.context.ExternalContext;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import org.w3c.dom.Element;

import com.icesoft.faces.context.DOMContext;
import com.icesoft.faces.renderkit.dom_html_basic.DomBasicRenderer;
import com.icesoft.util.CoreComponentUtils;

public class CoreUtils {
    private static Boolean renderPortletStyleClass;
    private static Boolean portletEnvironment;
    private static final Log log = LogFactory.getLog(CoreUtils.class);

    public static String resolveResourceURL(FacesContext facesContext, String path) {
        if (path == null || path.length() == 0) {
            return "";
        }
        ExternalContext ec = facesContext.getExternalContext();
        String ctxtPath = ec.getRequestContextPath();

        //ICE-6063: Strip the context path off if it's there because the ViewHandler no
        //longer includes that bit of logic.
        if (path.charAt(0) == '/' && path.startsWith(ctxtPath)) {
            path = path.substring(ctxtPath.length());
        }

        return facesContext.getApplication().getViewHandler().getResourceURL(facesContext, path);
    }

    public static boolean isPortletEnvironment() {
        if (portletEnvironment == null) {
            try {
                Class portletRequestClass = Class.forName("javax.portlet.PortletRequest");
                portletEnvironment = new Boolean(portletRequestClass
                        .isInstance(FacesContext.getCurrentInstance().getExternalContext().getRequest()));
            } catch (Throwable e) {
                //both ClassNotFoundException and NoClassDefError
                //portlet not found
                portletEnvironment = Boolean.FALSE;
            }
        }
        return portletEnvironment.booleanValue();
    }

    public static String getPortletStyleClass(String className) {
        if (isPortletEnvironment() && isRenderPortletStyleClass()) {
            return " " + className;
        }
        return "";
    }

    private static boolean isRenderPortletStyleClass() {
        if (renderPortletStyleClass == null) {
            String renderStyle = FacesContext.getCurrentInstance().getExternalContext()
                    .getInitParameter("com.icesoft.faces.portlet.renderStyles");
            if (renderStyle == null) {
                //default is true
                renderPortletStyleClass = Boolean.TRUE;
            } else {
                renderPortletStyleClass = Boolean.valueOf(renderStyle);
            }

        }
        return renderPortletStyleClass.booleanValue();
    }

    public static String addPortletStyleClassToQualifiedClass(String qualifiedStyleClass, String defaultClass,
            String portletClass) {
        return addPortletStyleClassToQualifiedClass(qualifiedStyleClass, defaultClass, portletClass, false);

    }

    public static String addPortletStyleClassToQualifiedClass(String qualifiedStyleClass, String defaultClass,
            String portletClass, boolean disabled) {
        if (isPortletEnvironment() && isRenderPortletStyleClass()) {
            if (disabled) {
                return qualifiedStyleClass.replaceAll(defaultClass + "-dis",
                        defaultClass + "-dis" + " " + portletClass);
            } else {
                return qualifiedStyleClass.replaceAll(defaultClass, defaultClass + " " + portletClass);
            }
        } else {
            return qualifiedStyleClass;
        }
    }

    /*
     * This method will help to retain the faces messages on the partialSubmit, 
     * the page refresh and the dynamic component rendering.
     * It will be called by two classes the DomBasicRenderer and the MessageRenderer.
     * 
     * Calling it from the DomBasicRenderer insures that there will always be a 
     * message in the default messages Map, only if the component was invalid. 
     * So if the jsp document has an "ice" or "h" messages component they can 
     * serve the default messages map. 
     * 
     * Calling this method from the MessageRenderer gives the component ordering
     * flexibility. (e.g) It doesn't matter if the "INPUT" component was rendered 
     * first or the "message" component.
     * 
     * Calling this method from two renderer will not cause any problem or side effect.
     * The first calling class will complete the work, and the next one will already 
     * find a message and won't repeat the process.
     */
    public static void recoverFacesMessages(FacesContext facesContext, UIComponent uiComponent) {
        if (!(uiComponent instanceof UIInput))
            return;
        UIInput input = (UIInput) uiComponent;
        String clientId = input.getClientId(facesContext);
        String localFacesMsgId = clientId + "$ice-msg$";
        String localRequired = clientId + "$ice-req$";
        //save the required attribute, specifically for UIData
        if (input.getAttributes().get(localRequired) == null) {
            // this property will be used by the UISeries.restoreRequiredAttribute()
            input.getAttributes().put(localRequired, new Boolean(input.isRequired()));
        }
        //component is invalid there should be a message in the default messages map
        if (!input.isValid()) {
            Iterator messages = facesContext.getMessages(clientId);
            FacesMessage message = null;
            //if no message found, then it might a page refresh call
            //or the request of dynamic rendering of the component. 
            //if so, get the message from the component's map and add
            //it to the default messages map
            if (messages == null || !messages.hasNext()) {
                if (input.getAttributes().get(localFacesMsgId) != null) {
                    message = ((FacesMessageHolder) input.getAttributes().get(localFacesMsgId)).message;
                    if (null != message) {
                        facesContext.addMessage(clientId, message);
                    }
                }
            } else {//if found, then store it to the component's message map,
                //so can be served later.
                message = (FacesMessage) messages.next();
                input.getAttributes().put(localFacesMsgId, new FacesMessageHolder(message));
            }
        } else { //component is valid, so remove the old message.
            input.getAttributes().remove(localFacesMsgId);
        }
    }

    public static int toolTipcounter = 1;

    public static void addPanelTooltip(FacesContext facesContext, UIComponent uiComponent) {
        DOMContext domContext = DOMContext.getDOMContext(facesContext, uiComponent);
        if (uiComponent.getAttributes().get("panelTooltip") == null)
            return;
        String panelTooltipId = String.valueOf(uiComponent.getAttributes().get("panelTooltip"));
        int delay = 500;
        String hideOn = "mouseout";
        boolean dynamic = false;
        String formId = "";
        String ctxValue = "";
        String displayOn = "hover";
        boolean moveWithMouse = false;

        //TODO: convert to :: utility findComponent
        //            UIComponent panelTooltip = D2DViewHandler.findComponent(panelTooltipId, uiComponent);
        //            UIComponent panelTooltip = facesContext.getViewRoot().findComponent(panelTooltipId);
        UIComponent panelTooltip = CoreComponentUtils.findComponent(panelTooltipId, uiComponent);
        if (panelTooltip != null/* && family type equals panelPopup*/) {
            //replace the id with the clientid
            panelTooltipId = panelTooltip.getClientId(facesContext);
            if (panelTooltip.getAttributes().get("hideOn") != null) {
                hideOn = String.valueOf(panelTooltip.getAttributes().get("hideOn"));
            }
            if (panelTooltip.getAttributes().get("dynamic") != null) {
                dynamic = ((Boolean) panelTooltip.getAttributes().get("dynamic")).booleanValue();
            }
            if (panelTooltip.getAttributes().get("hoverDelay") != null) {
                delay = new Integer(String.valueOf(panelTooltip.getAttributes().get("hoverDelay"))).intValue();
            }
            if (uiComponent.getAttributes().get("contextValue") != null) {
                ctxValue = String.valueOf(uiComponent.getAttributes().get("contextValue"));
            }
            if (panelTooltip.getAttributes().get("displayOn") != null) {
                displayOn = String.valueOf(panelTooltip.getAttributes().get("displayOn"));
            }
            if (panelTooltip.getAttributes().get("moveWithMouse") != null) {
                moveWithMouse = ((Boolean) panelTooltip.getAttributes().get("moveWithMouse")).booleanValue();
            }
        }
        UIComponent form = DomBasicRenderer.findForm(panelTooltip);
        if (form != null) {
            formId = form.getClientId(facesContext);
        }

        Element rootElement = (Element) domContext.getRootNode();
        String onAttr, onValue;
        if (displayOn.equals("click") || displayOn.equals("dblclick")) {
            onAttr = "on" + displayOn;
        } else if (displayOn.equals("altclick")) {
            onAttr = "oncontextmenu";
        } else {
            onAttr = "onmouseover";
        }
        onValue = String.valueOf(rootElement.getAttribute(onAttr));
        onValue += "; new ToolTipPanelPopup(this, '" + panelTooltipId + "', event, '" + hideOn + "','" + delay
                + "', '" + dynamic + "', '" + formId + "', '" + ctxValue + "','"
                + CoreUtils.resolveResourceURL(facesContext, "/xmlhttp/blank") + "','" + displayOn + "',"
                + moveWithMouse + ");";
        rootElement.setAttribute(onAttr, onValue);
    }

    public static boolean objectsEqual(Object ob1, Object ob2) {
        if (ob1 == null && ob2 == null) {
            return true;
        }
        if (ob1 == null || ob2 == null) {
            return false;
        }
        return ob1.equals(ob2);
    }

    public static boolean throwablesEqual(Throwable th1, Throwable th2) {
        if (th1 == null && th2 == null)
            return true;
        if (th1 == null || th2 == null)
            return false;
        if (th1.getClass() != th2.getClass())
            return false;

        if (!th1.getMessage().equals(th2.getMessage()))
            return false;

        StackTraceElement[] st1 = th1.getStackTrace();
        StackTraceElement[] st2 = th2.getStackTrace();
        if (st1.length != st2.length)
            return false;

        for (int i = 0; i < st1.length; i++) {
            if (!st1[i].equals(st2[i]))
                return false;
        }
        return true;
    }

    public static String getRealPath(FacesContext facesContext, String path) {
        Object session = FacesContext.getCurrentInstance().getExternalContext().getSession(false);
        if (session == null) {
            log.error("getRealPath() session is null", new NullPointerException());
            return null;
        }
        if (isPortletEnvironment()) {
            return getRealPath(session, "getPortletContext", path);
        } else {
            return getRealPath(session, "getServletContext", path);
        }
    }

    private static String getRealPath(Object session, String getContext, String path) {
        try {
            Method getContextMethod = session.getClass().getMethod(getContext, new Class[0]);
            Object context;
            context = getContextMethod.invoke(session, new Object[0]);
            Class[] classargs = { String.class };
            Method getRealPath = context.getClass().getMethod("getRealPath", classargs);
            Object[] args = { path };
            return String.valueOf(getRealPath.invoke(context, args));
        } catch (Exception e) {
            log.error("Error getting realpath", e);
            return null;
        }
    }
}

//remove this once FacesMessage.Severity is Serializable
//see https://javaserverfaces.dev.java.net/issues/show_bug.cgi?id=1766
class FacesMessageHolder implements Serializable {
    transient FacesMessage message;

    public FacesMessageHolder(FacesMessage message) {
        this.message = message;
    }
}