/*
 * 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.test.mock.lifecycle;

import java.util.Iterator;
import java.util.Map;

import javax.el.ValueExpression;
import javax.faces.FacesException;
import javax.faces.component.UIComponent;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * @author Mathias Broekelmann (latest modification by $Author: mbr $)
 * @version $Revision: 517403 $ $Date: 2007-03-12 22:17:00 +0100 (Mo, 12 Mrz 2007) $
 * @since 1.0.0
 */
public class DefaultRestoreViewSupport implements RestoreViewSupport
{
    private static final String JAVAX_SERVLET_INCLUDE_SERVLET_PATH = "javax.servlet.include.servlet_path";

    private static final String JAVAX_SERVLET_INCLUDE_PATH_INFO = "javax.servlet.include.path_info";

    private final Log log = LogFactory.getLog(DefaultRestoreViewSupport.class);

    public void processComponentBinding(FacesContext facesContext,
            UIComponent component)
    {
        ValueExpression binding = component.getValueExpression("binding");
        if (binding != null)
        {
            binding.setValue(facesContext.getELContext(), component);
        }

        for (Iterator iter = component.getFacetsAndChildren(); iter.hasNext();)
        {
            processComponentBinding(facesContext, (UIComponent) iter.next());
        }
    }

    public String calculateViewId(FacesContext facesContext)
    {
        //Assert.notNull(facesContext);
        ExternalContext externalContext = facesContext.getExternalContext();
        Map requestMap = externalContext.getRequestMap();

        String viewId = (String) requestMap
                .get(JAVAX_SERVLET_INCLUDE_PATH_INFO);
        boolean traceEnabled = log.isTraceEnabled();
        if (viewId != null)
        {
            if (traceEnabled)
            {
                log.trace("Calculated viewId '" + viewId
                        + "' from request param '"
                        + JAVAX_SERVLET_INCLUDE_PATH_INFO + "'");
            }
        }
        else
        {
            viewId = externalContext.getRequestPathInfo();
            if (viewId != null && traceEnabled)
            {
                log.trace("Calculated viewId '" + viewId
                        + "' from request path info");
            }
        }

        if (viewId == null)
        {
            viewId = (String) requestMap
                    .get(JAVAX_SERVLET_INCLUDE_SERVLET_PATH);
            if (viewId != null && traceEnabled)
            {
                log.trace("Calculated viewId '" + viewId
                        + "' from request param '"
                        + JAVAX_SERVLET_INCLUDE_SERVLET_PATH + "'");
            }
        }

        if (viewId == null)
        {
            viewId = externalContext.getRequestServletPath();
            if (viewId != null && traceEnabled)
            {
                log.trace("Calculated viewId '" + viewId
                        + "' from request servlet path");
            }
        }

        if (viewId == null)
        {
            throw new FacesException("Could not determine view id.");
        }

        return viewId;
    }

    public boolean isPostback(FacesContext facesContext)
    {
        return true;
    }
}
