Package org.apache.jetspeed.aggregator.impl

Source Code of org.apache.jetspeed.aggregator.impl.HeaderAggregatorImpl

/*
* 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.jetspeed.aggregator.impl;

import java.io.IOException;
import java.util.Iterator;
import java.util.Map;
import java.util.HashMap;
import java.util.List;
import java.util.ArrayList;
import java.util.Collections;

import javax.portlet.Portlet;

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

import org.apache.jetspeed.aggregator.FailedToRenderFragmentException;
import org.apache.jetspeed.aggregator.PageAggregator;
import org.apache.jetspeed.container.state.NavigationalState;
import org.apache.jetspeed.container.url.BasePortalURL;
import org.apache.jetspeed.container.window.PortletWindowAccessor;
import org.apache.jetspeed.decoration.DecorationFactory;
import org.apache.jetspeed.exception.JetspeedException;
import org.apache.jetspeed.factory.PortletFactory;
import org.apache.jetspeed.headerresource.HeaderResource;
import org.apache.jetspeed.headerresource.HeaderResourceFactory;
import org.apache.jetspeed.headerresource.HeaderResourceLib;
import org.apache.jetspeed.om.common.portlet.PortletApplication;
import org.apache.jetspeed.om.page.ContentFragment;
import org.apache.jetspeed.om.page.ContentPage;
import org.apache.jetspeed.portlet.PortletHeaderRequest;
import org.apache.jetspeed.portlet.PortletHeaderResponse;
import org.apache.jetspeed.portlet.SupportsHeaderPhase;
import org.apache.jetspeed.request.RequestContext;
import org.apache.jetspeed.PortalReservedParameters;
import org.apache.pluto.om.portlet.PortletDefinition;
import org.apache.pluto.om.window.PortletWindow;

/**
* HeaderAggregator builds the content required to render a page of portlets.
*
* @author <a href="mailto:raphael@apache.org">Rapha�l Luta </a>
* @author <a href="mailto:taylor@apache.org">David Sean Taylor </a>
* @author <a href="mailto:smilek@apache.org">Steve Milek</a>
* @version $Id: HeaderAggregatorImpl.java 359125 2005-12-26 23:16:39Z rwatler $
*/
public class HeaderAggregatorImpl implements PageAggregator
{
    protected final static Log log = LogFactory.getLog( HeaderAggregatorImpl.class );
    protected final static String EOL = "\r\n";   // html eol

    private PortletFactory factory;
    private PortletWindowAccessor windowAccessor;
    private HeaderResourceFactory headerResourceFactory;
    private DecorationFactory decorationFactory;
   
    private boolean isDesktop;
   
    private Map headerConfiguration;
    private Map headerResourceRegistry;
    private Map headerDynamicConfigurationDefault;
    private Map headerNamedResourcesDefault;
    private Map headerNamedResourcesAddedFragmentsDefault;
   
    /** base portal URL to override default URL server info from servlet */
    private BasePortalURL baseUrlAccess = null;
   
   
    public HeaderAggregatorImpl( PortletFactory factory,
                                 PortletWindowAccessor windowAccessor,
                                 HeaderResourceFactory headerResourceFactory,
                                 boolean isDesktop,
                                 Map headerConfiguration,
                                 Map headerResourceRegistry,
                                 DecorationFactory decorationFactory )
    {
        this( factory, windowAccessor, headerResourceFactory, isDesktop, headerConfiguration, headerResourceRegistry, decorationFactory, null );
    }
   
    public HeaderAggregatorImpl( PortletFactory factory,
                                 PortletWindowAccessor windowAccessor,
                                 HeaderResourceFactory headerResourceFactory,
                                 boolean isDesktop,
                                 Map headerConfiguration,
                                 Map headerResourceRegistry,
                                 DecorationFactory decorationFactory,
                                 BasePortalURL baseUrlAccess )
    {
        this.factory = factory;
        this.windowAccessor = windowAccessor;
        this.headerResourceFactory = headerResourceFactory;
        this.isDesktop = isDesktop;
        this.baseUrlAccess = baseUrlAccess;
        this.decorationFactory = decorationFactory;
        initializeHeaderConfiguration( headerConfiguration, headerResourceRegistry );  
    }
   
    /**
     * Initialize header configuration, making immutable copies of the data structures and
     * compiling as much finished static header content as possible (to minimize repetitive work per request)
     */
    private void initializeHeaderConfiguration( Map headerConfigArg, Map headerRsrcRegistryArg )
    {
        this.headerConfiguration = null;
        this.headerResourceRegistry = null;
        this.headerDynamicConfigurationDefault = null;
        this.headerNamedResourcesDefault = null;
        this.headerNamedResourcesAddedFragmentsDefault = null;
       
        if ( headerConfigArg != null && headerConfigArg.size() > 0 )
        {
            // attempt to make safe immutable copy of headerConfigArg
            HashMap headerConfig = new HashMap();
            Iterator headerConfigEntryIter = headerConfigArg.entrySet().iterator();
            while ( headerConfigEntryIter.hasNext() )
            {
                Map.Entry headerConfigEntry = (Map.Entry)headerConfigEntryIter.next();
                Object headerConfigKey = headerConfigEntry.getKey();
                Object headerConfigVal = headerConfigEntry.getValue();
                if ( headerConfigVal instanceof Map )
                {
                    headerConfig.put( headerConfigKey, Collections.unmodifiableMap( new HashMap( (Map)headerConfigVal ) ) );
                }
                else if ( headerConfigVal instanceof List )
                {
                    headerConfig.put( headerConfigKey, Collections.unmodifiableList( new ArrayList( (List)headerConfigVal ) ) );
                }
                else
                {
                    headerConfig.put( headerConfigKey, headerConfigVal );
                }
            }
            this.headerConfiguration = Collections.unmodifiableMap( headerConfig );
           
            // make modifiable copy of headerRsrcRegistryArg - is made immutable at end of initializeHeaderConfiguration()
            Map headerRsrcRegistry = null;
            if ( headerRsrcRegistryArg != null && headerRsrcRegistryArg.size() > 0 )
            {
                headerRsrcRegistry = new HashMap( headerRsrcRegistryArg );
                // leave modifiable during initializeHeaderConfigurationDefaults() protocol
                //    (so that entries can be removed - possibly leading to an empty map which will save a bunch of gratuitous lookups)
            }
            else
            {
                headerRsrcRegistry = new HashMap();
            }
            this.headerResourceRegistry = headerRsrcRegistry;  

            HashMap namedResourcesDefault = new HashMap();
            HashMap namedResourcesAddedFragmentsDefault = new HashMap();
           
            Map dynamicConfigurationDefault = initializeHeaderConfigurationDefaults( namedResourcesDefault, namedResourcesAddedFragmentsDefault );
            if ( dynamicConfigurationDefault != null )
                this.headerDynamicConfigurationDefault = Collections.unmodifiableMap( dynamicConfigurationDefault );
           
            this.headerNamedResourcesDefault = Collections.unmodifiableMap( namedResourcesDefault );
            this.headerNamedResourcesAddedFragmentsDefault = Collections.unmodifiableMap( namedResourcesAddedFragmentsDefault );
           
            this.headerResourceRegistry = null;
            if ( headerRsrcRegistry != null && headerRsrcRegistry.size() > 0 )
            {
                this.headerResourceRegistry = Collections.unmodifiableMap( headerRsrcRegistry );
            }
        }
    }

    /**
     * Initialize dynamic-header-configuration and call initializeHeaderConfigurationEntryDefaults() for
     * each key in headerConfiguration Map, allowing for each to add resources and settings to:
     * headerNamedResourcesDefault, headerNamedResourcesAddedFragmentsDefault and headerDynamicConfigurationDefault
     *
     * If no specific handler is defined for a headerConfiguration key, the entry is copied to headerDynamicConfigurationDefault
     * otherwise the handler is responsible for adding information to headerDynamicConfigurationDefault
     *
     * headerConfiguration handlers are currently defined for the headerConfiguration keys:
     *    "header.order"         - HeaderResource.HEADER_CONFIG_ORDER
     *    "header.types"         - HeaderResource.HEADER_CONFIG_TYPES
     *    "header.requiredflag"  - HeaderResource.HEADER_CONFIG_REQUIREDFLAG
     *    "dojo"                 - HeaderResource.HEADER_CONFIG_DOJO
     *    "desktop"              - HeaderResource.HEADER_CONFIG_DESKTOP
     */
    protected Map initializeHeaderConfigurationDefaults( HashMap namedResourcesDefault, HashMap namedResourcesAddedFragmentsDefault )
    {
        if ( this.headerConfiguration == null )
        {
            return null;
        }
       
        HashMap headerDynamicConfigurationDefault = new HashMap();
       
        initializeHeaderOrderConfigurationDefaults( namedResourcesDefault, namedResourcesAddedFragmentsDefault, headerDynamicConfigurationDefault );

        // setting header.basetag type - without adding it to order
        setNamedHeaderResourceProperties( HeaderResource.HEADER_SECTION_BASE_TAG, HeaderResource.HEADER_TYPE_BASE_TAG, null, headerDynamicConfigurationDefault );
       
        Iterator hConfigEntryIter = this.headerConfiguration.entrySet().iterator();
        while ( hConfigEntryIter.hasNext() )
        {
            Map.Entry hConfigEntry = (Map.Entry)hConfigEntryIter.next();
            Object hConfigKey = hConfigEntry.getKey();
            Object hConfigVal = hConfigEntry.getValue();
           
            if ( ! initializeHeaderConfigurationEntryDefaults( hConfigKey, hConfigVal, namedResourcesDefault, namedResourcesAddedFragmentsDefault, headerDynamicConfigurationDefault ) )
            {
                if ( hConfigVal instanceof Map )
                {
                    headerDynamicConfigurationDefault.put( hConfigKey, Collections.unmodifiableMap( new HashMap( (Map)hConfigVal ) ) );
                }
                else if ( hConfigVal instanceof List )
                {
                    headerDynamicConfigurationDefault.put( hConfigKey, Collections.unmodifiableList( new ArrayList( (List)hConfigVal ) ) );
                }
                else
                {
                    headerDynamicConfigurationDefault.put( hConfigKey, hConfigVal );
                }
            }
        }
        initializeMissingHeaderConfigurationEntryDefaults( namedResourcesDefault, namedResourcesAddedFragmentsDefault, headerDynamicConfigurationDefault );
       
        postinitializeHeaderOrderConfigurationDefaults( headerDynamicConfigurationDefault );
       
        return headerDynamicConfigurationDefault;
    }
   
    protected void initializeHeaderOrderConfigurationDefaults( HashMap namedResourcesDefault, HashMap namedResourcesAddedFragmentsDefault, HashMap headerDynamicConfigurationDefault )
    {
        if ( this.headerConfiguration != null )
        {
            List headerOrderConfigList = (List)this.headerConfiguration.get( HeaderResource.HEADER_CONFIG_ORDER );
            if ( headerOrderConfigList != null && headerOrderConfigList.size() > 0 )
            {
                ArrayList headerOrderList = new ArrayList();
                Map headerNames = new HashMap();
                Iterator headerOrderListIter = headerOrderConfigList.iterator();
                while ( headerOrderListIter.hasNext() )
                {
                    Object headerNameObj = headerOrderListIter.next();
                    if ( headerNameObj != null )
                    {
                        String headerName = headerNameObj.toString();
                        if ( headerName != null && headerName.length() > 0 )
                        {
                            headerOrderList.add( headerName );
                            headerNames.put( headerName, Boolean.TRUE );
                        }
                    }
                }
                // add modifiable structures at this point - so that later initialization steps can manipulate the defaults
                // needs to be made unmodifiable at end of processing by calling postinitializeHeaderOrderConfigurationDefaults()
                headerDynamicConfigurationDefault.put( HeaderResource.HEADER_CONFIG_ORDER, headerOrderList );
                headerDynamicConfigurationDefault.put( HeaderResource.HEADER_INTERNAL_INCLUDED_NAMES, headerNames );
            }
           
            Map headerTypes = null;
            Map headerTypesConfig = (Map)this.headerConfiguration.get( HeaderResource.HEADER_CONFIG_TYPES );
            if ( headerTypesConfig != null && headerTypesConfig.size() > 0 )
            {
                headerTypes = new HashMap();
                Iterator headerTypesConfigIter = headerTypesConfig.entrySet().iterator();
                while ( headerTypesConfigIter.hasNext() )
                {
                    Map.Entry headerTypeEntry = (Map.Entry)headerTypesConfigIter.next();
                    Object headerNameObj = headerTypeEntry.getKey();
                    Object headerTypeObj = headerTypeEntry.getValue();
                    if ( headerNameObj != null && headerTypeObj != null )
                    {
                        String headerName = headerNameObj.toString();
                        int headerTypeId = HeaderResourceLib.getHeaderTypeId( headerTypeObj.toString() );
                        if ( headerName != null )
                        {
                            if ( headerTypeId >= 0 )
                            {
                                headerTypes.put( headerName, new Object[] { new Integer( headerTypeId ), null } );
                            }
                            else
                            {
                                log.error( "HeaderAggregatorImpl.initializeHeaderOrderConfigurationDefaults() ignoring specification of unknown header section type; header-section-name=" + headerName + " header-section-type=" + headerTypeObj.toString() );
                            }
                        }
                    }
                }
            }
           
            Map headerRequiredFlagConfig = (Map)this.headerConfiguration.get( HeaderResource.HEADER_CONFIG_REQUIREDFLAG );
            if ( headerRequiredFlagConfig != null && headerRequiredFlagConfig.size() > 0 )
            {
                if ( headerTypes == null )
                {
                    headerTypes = new HashMap();
                }
                Iterator headerRequiredFlagConfigIter = headerRequiredFlagConfig.entrySet().iterator();
                while ( headerRequiredFlagConfigIter.hasNext() )
                {
                    Map.Entry headerRequiredFlagEntry = (Map.Entry)headerRequiredFlagConfigIter.next();
                    Object headerNameObj = headerRequiredFlagEntry.getKey();
                    Object headerReqFlagObj = headerRequiredFlagEntry.getValue();
                    if ( headerNameObj != null && headerReqFlagObj != null )
                    {
                        String headerName = headerNameObj.toString();
                        String headerReqFlag = headerReqFlagObj.toString();
                        if ( headerName != null && headerName.length() > 0 && headerReqFlag != null )
                        {
                            Object[] headerTypePair = (Object[])headerTypes.get( headerName );
                            if ( headerTypePair != null )
                            {
                                headerTypePair[1] = headerReqFlag;
                            }
                            else
                            {
                                headerTypePair = new Object[] { null, headerReqFlag };
                                headerTypes.put( headerName, headerTypePair );
                            }
                        }
                    }
                }
            }
            if ( headerTypes != null && headerTypes.size() > 0 )
            {
                headerDynamicConfigurationDefault.put( HeaderResource.HEADER_CONFIG_TYPES, headerTypes );
            }
        }
    }
    protected void postinitializeHeaderOrderConfigurationDefaults( HashMap headerDynamicConfigurationDefault )
    {
        if ( headerDynamicConfigurationDefault != null )
        {
            Map headerNames = (Map)headerDynamicConfigurationDefault.get( HeaderResource.HEADER_INTERNAL_INCLUDED_NAMES );
            if ( headerNames != null )
            {
                headerDynamicConfigurationDefault.put( HeaderResource.HEADER_INTERNAL_INCLUDED_NAMES, Collections.unmodifiableMap( headerNames ) );
            }
            Map headerTypes = (Map)headerDynamicConfigurationDefault.get( HeaderResource.HEADER_CONFIG_TYPES );
            if ( headerTypes != null )
            {
                headerDynamicConfigurationDefault.put( HeaderResource.HEADER_CONFIG_TYPES, Collections.unmodifiableMap( headerTypes ) );
            }
            List headerOrderList = (List)headerDynamicConfigurationDefault.get( HeaderResource.HEADER_CONFIG_ORDER );
            if ( headerOrderList != null )
            {
                headerDynamicConfigurationDefault.put( HeaderResource.HEADER_CONFIG_ORDER, Collections.unmodifiableList( headerOrderList ) );
            }
        }
    }
   
    /**
     * Intended as derived class hook into header configuration process
     *
     * @return true if headerConfigKey has been processed or false if default processing should occur
     */
    protected boolean initializeHeaderConfigurationEntryDefaults( Object headerConfigKey, Object headerConfigValue, HashMap namedResourcesDefault, HashMap namedResourcesAddedFragmentsDefault, HashMap headerDynamicConfigurationDefault )
    {
        if ( headerConfigKey.equals( HeaderResource.HEADER_CONFIG_ORDER ) || headerConfigKey.equals( HeaderResource.HEADER_CONFIG_TYPES ) || headerConfigKey.equals( HeaderResource.HEADER_CONFIG_REQUIREDFLAG ) )
        {
            // do nothing - processed earlier with call to initializeHeaderOrderConfigurationDefaults()
            return true;
        }
        else if ( headerConfigKey.equals( HeaderResource.HEADER_CONFIG_DOJO ) )
        {
            initializeDojoHeaderConfigurationDefaults( (Map)headerConfigValue, namedResourcesDefault, namedResourcesAddedFragmentsDefault, headerDynamicConfigurationDefault );
            return true;
        }
        else if ( headerConfigKey.equals( HeaderResource.HEADER_CONFIG_DESKTOP ) )
        {
            initializeDesktopHeaderConfigurationDefaults( (Map)headerConfigValue, namedResourcesDefault, namedResourcesAddedFragmentsDefault, headerDynamicConfigurationDefault );
            return true;
        }
        return false;
    }
   
    protected void initializeMissingHeaderConfigurationEntryDefaults( HashMap namedResourcesDefault, HashMap namedResourcesAddedFragmentsDefault, HashMap headerDynamicConfigurationDefault )
    {
        if ( isDesktop() )
        {
            if ( this.headerConfiguration.get( HeaderResource.HEADER_CONFIG_DOJO ) == null )
            {
                initializeDojoHeaderConfigurationDefaults( null, namedResourcesDefault, namedResourcesAddedFragmentsDefault, headerDynamicConfigurationDefault );
            }
            if ( this.headerConfiguration.get( HeaderResource.HEADER_CONFIG_DESKTOP ) == null )
            {
                initializeDesktopHeaderConfigurationDefaults( null, namedResourcesDefault, namedResourcesAddedFragmentsDefault, headerDynamicConfigurationDefault );
            }
        }
    }
   
    protected void registerAndOrderNamedHeaderResource( String headerName, String headerType, String headerReqFlag, Map headerDynamicConfigurationDefault )
    {
        orderNamedHeaderResource( headerName, headerDynamicConfigurationDefault );
        setNamedHeaderResourceProperties( headerName, headerType, headerReqFlag, headerDynamicConfigurationDefault );
    }
   
    protected void orderNamedHeaderResource( String headerName, Map headerDynamicConfigurationDefault )
    {
        if ( headerName != null )
        {
            Map headerNames = (Map)headerDynamicConfigurationDefault.get( HeaderResource.HEADER_INTERNAL_INCLUDED_NAMES );
            if ( headerNames == null )
            {
                headerNames = new HashMap();
                headerDynamicConfigurationDefault.put( HeaderResource.HEADER_INTERNAL_INCLUDED_NAMES, headerNames );
            }
           
            Object headerNamesVal = headerNames.get( headerName );
            if ( headerNamesVal == null )
            {
                List headerOrderList = (List)headerDynamicConfigurationDefault.get( HeaderResource.HEADER_CONFIG_ORDER );
                if ( headerOrderList == null )
                {
                    headerOrderList = new ArrayList();
                    headerDynamicConfigurationDefault.put( HeaderResource.HEADER_CONFIG_ORDER, headerOrderList );
                }
               
                headerOrderList.add( headerName );
                headerNames.put( headerName, Boolean.TRUE );
            }
        }
    }
   
    protected void setNamedHeaderResourceProperties( String headerName, String headerType, String headerReqFlag, Map headerDynamicConfigurationDefault )
    {
        if ( headerName != null )
        {
            int headerTypeId = HeaderResourceLib.getHeaderTypeId( headerType );
           
            boolean headerRefFlagSpecified = ( headerReqFlag != null && headerReqFlag.length() > 0 );
            if ( headerTypeId < 0 && ! headerRefFlagSpecified )
            {
                log.error( "HeaderAggregatorImpl.registerAndOrderNamedHeaderResource() ignoring specification of unknown header section type; header-section-name=" + headerName + " header-section-type=" + headerType );
            }
           
            if ( ( headerTypeId >= 0 ) || headerRefFlagSpecified )
            {
                Map headerTypes = (Map)headerDynamicConfigurationDefault.get( HeaderResource.HEADER_CONFIG_TYPES );
                if ( headerTypes == null )
                {
                    headerTypes = new HashMap();
                    headerDynamicConfigurationDefault.put( HeaderResource.HEADER_CONFIG_TYPES, headerTypes );
                }
               
                Object[] headerTypePair = (Object[])headerTypes.get( headerName );
                if ( headerTypePair == null )
                {
                    headerTypePair = new Object[] { null, null };
                    headerTypes.put( headerName, headerTypePair );
                }
                if ( headerTypePair[0] == null && headerTypeId >= 0 )
                {   // change only if value from configuration is null
                    headerTypePair[0] = new Integer( headerTypeId );
                }
                if ( headerTypePair[1] == null && headerReqFlag != null && headerReqFlag.length() > 0 )
                {   // change only if value from configuration is null
                    headerTypePair[1] = headerReqFlag;
                }
            }
        }
    }
   
    protected boolean canAddHeaderNamedResourceFragment( String headerFragmentName, HashMap namedResourcesAddedFragmentsDefault, String[] registryContent )
    {
        if ( headerFragmentName != null && ! namedResourcesAddedFragmentsDefault.containsKey( headerFragmentName ) )
        {
            namedResourcesAddedFragmentsDefault.put( headerFragmentName, Boolean.TRUE );
            if ( registryContent != null )
            {
                String registryContentVal = (String)this.headerResourceRegistry.get( headerFragmentName );
                registryContent[0] = registryContentVal;
                if ( registryContentVal != null )
                {
                    this.headerResourceRegistry.remove( headerFragmentName );
                }
            }
            return true;
        }
        if ( registryContent != null )
        {
            registryContent[0] = null;
        }
        return false;
    }
       
    protected void initializeDesktopHeaderConfigurationDefaults( Map desktopConfigMap, HashMap namedResourcesDefault, HashMap namedResourcesAddedFragmentsDefault, HashMap headerDynamicConfigurationDefault )
    {
        if ( desktopConfigMap == null )
        {
            desktopConfigMap = new HashMap();
        }
       
        StringBuffer desktopDojoConfigContent = new StringBuffer();
       
        String layoutDecorationDefaultName = HeaderResource.HEADER_CONFIG_DESKTOP_LAYOUT_DECORATION_DEFAULT;
        String layoutDecoration = (String)desktopConfigMap.get( layoutDecorationDefaultName );
        if ( layoutDecoration != null && layoutDecoration.length() > 0 )
        {
            decorationFactory.setDefaultDesktopLayoutDecoration( layoutDecoration );
        }
       
        String portletDecorationDefaultName = HeaderResource.HEADER_CONFIG_DESKTOP_PORTLET_DECORATION_DEFAULT;
        String portletDecoration = (String)desktopConfigMap.get( portletDecorationDefaultName );
        if ( portletDecoration == null || portletDecoration.length() == 0 )
        {
            portletDecoration = decorationFactory.getDefaultDesktopPortletDecoration();
        }
        if ( portletDecoration != null && portletDecoration.length() > 0 )
        {
            if ( canAddHeaderNamedResourceFragment( portletDecorationDefaultName, namedResourcesAddedFragmentsDefault, null ) )
            {
                desktopDojoConfigContent.append( "    " ).append( HeaderResource.HEADER_INTERNAL_DOJO_CONFIG_JETSPEED_VAR_NAME ).append( ".windowDecoration = \"" ).append( portletDecoration ).append( "\";" ).append( EOL );
            }
            decorationFactory.setDefaultDesktopPortletDecoration( portletDecoration );
        }
       
        String desktopPageAjaxNavName = HeaderResource.HEADER_CONFIG_DESKTOP_PAGE_AJAXNAVIGATION;
        String desktopPageAjaxNav = HeaderResourceLib.makeJSONBoolean( desktopConfigMap.get( desktopPageAjaxNavName ) );
        if ( desktopPageAjaxNav != null && canAddHeaderNamedResourceFragment( desktopPageAjaxNavName, namedResourcesAddedFragmentsDefault, null ) )
        {
            desktopDojoConfigContent.append( "    " ).append( HeaderResource.HEADER_INTERNAL_DOJO_CONFIG_JETSPEED_VAR_NAME ).append( ".ajaxPageNavigation = " ).append( desktopPageAjaxNav ).append( ";" ).append( EOL );
        }
       
        String desktopWindowTilingName = HeaderResource.HEADER_CONFIG_DESKTOP_WINDOW_TILING;
        String desktopWindowTiling = HeaderResourceLib.makeJSONBoolean( desktopConfigMap.get( desktopWindowTilingName ) );
        if ( desktopWindowTiling != null && canAddHeaderNamedResourceFragment( desktopWindowTilingName, namedResourcesAddedFragmentsDefault, null ) )
        {
            desktopDojoConfigContent.append( "    " ).append( HeaderResource.HEADER_INTERNAL_DOJO_CONFIG_JETSPEED_VAR_NAME ).append( ".windowTiling = " ).append( desktopWindowTiling ).append( ";" ).append( EOL );
        }
       
        String desktopWindowHeightExpandName = HeaderResource.HEADER_CONFIG_DESKTOP_WINDOW_HEIGHT_EXPAND;
        String desktopWindowHeightExpand = HeaderResourceLib.makeJSONBoolean( desktopConfigMap.get( desktopWindowHeightExpandName ) );
        if ( desktopWindowHeightExpand != null && canAddHeaderNamedResourceFragment( desktopWindowHeightExpandName, namedResourcesAddedFragmentsDefault, null ) )
        {
            desktopDojoConfigContent.append( "    " ).append( HeaderResource.HEADER_INTERNAL_DOJO_CONFIG_JETSPEED_VAR_NAME ).append( ".windowHeightExpand = " ).append( desktopWindowHeightExpand ).append( ";" ).append( EOL );
        }

        String desktopWindowHeightName = HeaderResource.HEADER_CONFIG_DESKTOP_WINDOW_HEIGHT;
        String desktopWindowHeight = HeaderResourceLib.makeJSONInteger( desktopConfigMap.get( desktopWindowHeightName ), true );
        if ( desktopWindowHeight != null && canAddHeaderNamedResourceFragment( desktopWindowHeightName, namedResourcesAddedFragmentsDefault, null ) )
        {
            desktopDojoConfigContent.append( "    " ).append( HeaderResource.HEADER_INTERNAL_DOJO_CONFIG_JETSPEED_VAR_NAME ).append( ".windowHeight = " ).append( desktopWindowHeight ).append( ";" ).append( EOL );
        }
       
        String desktopWindowWidthName = HeaderResource.HEADER_CONFIG_DESKTOP_WINDOW_WIDTH;
        String desktopWindowWidth = HeaderResourceLib.makeJSONInteger( desktopConfigMap.get( desktopWindowWidthName ), true );
        if ( desktopWindowWidth != null && canAddHeaderNamedResourceFragment( desktopWindowWidthName, namedResourcesAddedFragmentsDefault, null ) )
        {
            desktopDojoConfigContent.append( "    " ).append( HeaderResource.HEADER_INTERNAL_DOJO_CONFIG_JETSPEED_VAR_NAME ).append( ".windowWidth = " ).append( desktopWindowWidth ).append( ";" ).append( EOL );
        }
       
        List actionList = new ArrayList();
       
        String windowActionButtonOrderName = HeaderResource.HEADER_CONFIG_DESKTOP_WINDOW_ACTION_BUTTON_ORDER;
        String actionButtonOrderContent = HeaderResourceLib.makeJSONStringArray( (List)desktopConfigMap.get( windowActionButtonOrderName ), actionList );
        if ( actionButtonOrderContent != null && actionButtonOrderContent.length() > 0 )
        {
            if ( canAddHeaderNamedResourceFragment( windowActionButtonOrderName, namedResourcesAddedFragmentsDefault, null ) )
            {
                desktopDojoConfigContent.append( "    " ).append( HeaderResource.HEADER_INTERNAL_DOJO_CONFIG_JETSPEED_VAR_NAME ).append( ".windowActionButtonOrder = " ).append( actionButtonOrderContent ).append( ";" ).append( EOL );
            }
        }
       
        String windowActionNoImageName = HeaderResource.HEADER_CONFIG_DESKTOP_WINDOW_ACTION_NOIMAGE;
        String actionNoImageContent = HeaderResourceLib.makeJSONStringArray( (List)desktopConfigMap.get( windowActionNoImageName ), actionList );
        if ( actionNoImageContent != null && actionNoImageContent.length() > 0 )
        {
            if ( canAddHeaderNamedResourceFragment( windowActionNoImageName, namedResourcesAddedFragmentsDefault, null ) )
            {
                desktopDojoConfigContent.append( "    " ).append( HeaderResource.HEADER_INTERNAL_DOJO_CONFIG_JETSPEED_VAR_NAME ).append( ".windowActionNoImage = " ).append( actionNoImageContent ).append( ";" ).append( EOL );
            }
        }
       
        String windowActionMenuOrderName = HeaderResource.HEADER_CONFIG_DESKTOP_WINDOW_ACTION_MENU_ORDER;
        String actionMenuOrderContent = HeaderResourceLib.makeJSONStringArray( (List)desktopConfigMap.get( windowActionMenuOrderName ), actionList );
        if ( actionMenuOrderContent != null && actionMenuOrderContent.length() > 0 )
        {
            if ( canAddHeaderNamedResourceFragment( windowActionMenuOrderName, namedResourcesAddedFragmentsDefault, null ) )
            {
                desktopDojoConfigContent.append( "    " ).append( HeaderResource.HEADER_INTERNAL_DOJO_CONFIG_JETSPEED_VAR_NAME ).append( ".windowActionMenuOrder = " ).append( actionMenuOrderContent ).append( ";" ).append( EOL );
            }
        }

        headerDynamicConfigurationDefault.put( HeaderResource.HEADER_INTERNAL_CONFIG_DESKTOP_WINDOW_ACTION, actionList );


        String windowActionButtonHideName = HeaderResource.HEADER_CONFIG_DESKTOP_WINDOW_ACTION_BUTTON_HIDE;
        String windowActionButtonHide = HeaderResourceLib.makeJSONBoolean( desktopConfigMap.get( windowActionButtonHideName ) );
        if ( windowActionButtonHide != null && canAddHeaderNamedResourceFragment( windowActionButtonHideName, namedResourcesAddedFragmentsDefault, null ) )
        {
            desktopDojoConfigContent.append( "    " ).append( HeaderResource.HEADER_INTERNAL_DOJO_CONFIG_JETSPEED_VAR_NAME ).append( ".windowActionButtonHide = " ).append( windowActionButtonHide ).append( ";" ).append( EOL );
        }
       
        String windowActionButtonTooltipName = HeaderResource.HEADER_CONFIG_DESKTOP_WINDOW_ACTION_BUTTON_TOOLTIP;
        String windowActionButtonTooltip = HeaderResourceLib.makeJSONBoolean( desktopConfigMap.get( windowActionButtonTooltipName ) );
        if ( windowActionButtonTooltip != null && canAddHeaderNamedResourceFragment( windowActionButtonTooltipName, namedResourcesAddedFragmentsDefault, null ) )
        {
            desktopDojoConfigContent.append( "    " ).append( HeaderResource.HEADER_INTERNAL_DOJO_CONFIG_JETSPEED_VAR_NAME ).append( ".windowActionButtonTooltip = " ).append( windowActionButtonTooltip ).append( ";" ).append( EOL );
        }

        String windowActionButtonMaxName = HeaderResource.HEADER_CONFIG_DESKTOP_WINDOW_ACTION_BUTTON_MAX;
        String windowActionButtonMax = HeaderResourceLib.makeJSONInteger( desktopConfigMap.get( windowActionButtonMaxName ), false );
        if ( windowActionButtonMax != null && canAddHeaderNamedResourceFragment( windowActionButtonMaxName, namedResourcesAddedFragmentsDefault, null ) )
        {
            desktopDojoConfigContent.append( "    " ).append( HeaderResource.HEADER_INTERNAL_DOJO_CONFIG_JETSPEED_VAR_NAME ).append( ".windowActionButtonMax = " ).append( windowActionButtonMax ).append( ";" ).append( EOL );
        }
       
        String windowIconEnabledName = HeaderResource.HEADER_CONFIG_DESKTOP_WINDOW_ICON_ENABLED;
        String iconEnabledContent = HeaderResourceLib.makeJSONBoolean( desktopConfigMap.get( windowIconEnabledName ) );
        if ( iconEnabledContent != null && iconEnabledContent.length() > 0 )
        {
            if ( canAddHeaderNamedResourceFragment( windowIconEnabledName, namedResourcesAddedFragmentsDefault, null ) )
            {
                desktopDojoConfigContent.append( "    " ).append( HeaderResource.HEADER_INTERNAL_DOJO_CONFIG_JETSPEED_VAR_NAME ).append( ".windowIconEnabled = " ).append( iconEnabledContent ).append( ";" ).append( EOL );
            }
        }
       
        String windowIconPathName = HeaderResource.HEADER_CONFIG_DESKTOP_WINDOW_ICON_PATH;
        String iconPathContent = (String)desktopConfigMap.get( windowIconPathName );
        if ( iconPathContent != null && iconPathContent.length() > 0 )
        {
            if ( canAddHeaderNamedResourceFragment( windowIconPathName, namedResourcesAddedFragmentsDefault, null ) )
            {
                desktopDojoConfigContent.append( "    " ).append( HeaderResource.HEADER_INTERNAL_DOJO_CONFIG_JETSPEED_VAR_NAME ).append( ".windowIconPath = \"" ).append( iconPathContent ).append( "\";" ).append( EOL );
            }
        }
       
        String pageActionButtonTooltipName = HeaderResource.HEADER_CONFIG_DESKTOP_PAGE_ACTION_BUTTON_TOOLTIP;
        String pageActionButtonTooltip = HeaderResourceLib.makeJSONBoolean( desktopConfigMap.get( pageActionButtonTooltipName ) );
        if ( pageActionButtonTooltip != null && canAddHeaderNamedResourceFragment( pageActionButtonTooltipName, namedResourcesAddedFragmentsDefault, null ) )
        {
            desktopDojoConfigContent.append( "    " ).append( HeaderResource.HEADER_INTERNAL_DOJO_CONFIG_JETSPEED_VAR_NAME ).append( ".pageActionButtonTooltip = " ).append( pageActionButtonTooltip ).append( ";" ).append( EOL );
        }

        if ( desktopDojoConfigContent.length() > 0 )
        {
            namedResourcesDefault.put( HeaderResource.HEADER_SECTION_DOJO_CONFIG, desktopDojoConfigContent.toString() );
        }
       
        StringBuffer desktopInitScript = new StringBuffer();
        desktopInitScript.append( "    function doRender(bindArgs,portletEntityId) { " );
        desktopInitScript.append( "jetspeed.doRender(bindArgs,portletEntityId); }" ).append( EOL );
        desktopInitScript.append( "    function doAction(bindArgs,portletEntityId) { " );
        desktopInitScript.append( "jetspeed.doAction(bindArgs,portletEntityId); }" ).append( EOL );
        desktopInitScript.append( "    dojo.addOnLoad( jetspeed.initializeDesktop );" ).append( EOL );
        if ( canAddHeaderNamedResourceFragment( "desktop.init", namedResourcesAddedFragmentsDefault, null ) )
        {
            namedResourcesDefault.put( HeaderResource.HEADER_SECTION_DESKTOP_INIT, desktopInitScript.toString() );
            setNamedHeaderResourceProperties( HeaderResource.HEADER_SECTION_DESKTOP_INIT, HeaderResource.HEADER_TYPE_SCRIPT_BLOCK_START, null, headerDynamicConfigurationDefault );
        }
    }
   
    /**
     * Read dojo header configuration settings and compile dojo header resource defaults
     */
    protected void initializeDojoHeaderConfigurationDefaults( Map dojoConfigMap, HashMap namedResourcesDefault, HashMap namedResourcesAddedFragmentsDefault, HashMap headerDynamicConfigurationDefault )
    {
        if ( dojoConfigMap == null )
        {
            dojoConfigMap = new HashMap();
        }
        String[] registryContent = new String[] { null };
       
        // add dojo.enable and dojo.path to dynamic configuration
        String dojoEnableName = HeaderResource.HEADER_CONFIG_DOJO_ENABLE;
        Object dojoEnableObj = dojoConfigMap.get( dojoEnableName );
        String dojoEnable = ( ( dojoEnableObj == null ) ? (String)null : dojoEnableObj.toString() );
        if ( dojoEnable == null || ! dojoEnable.equals( "true" ) )
        {
            dojoEnable = "false";
        }
        headerDynamicConfigurationDefault.put( dojoEnableName, dojoEnable );
        String dojoPath = (String)dojoConfigMap.get( HeaderResource.HEADER_CONFIG_DOJO_PATH );
        if ( dojoPath == null || dojoPath.length() == 0 )
        {
            dojoPath = "/javascript/dojo/";
        }
        headerDynamicConfigurationDefault.put( HeaderResource.HEADER_CONFIG_DOJO_PATH, dojoPath );
       
        // dojo parameters - djConfig parameters
        String dojoParamDebug = (String)dojoConfigMap.get( HeaderResource.HEADER_CONFIG_DOJO_PARAM_ISDEBUG );
        String dojoParamDebugAtAllCosts = (String)dojoConfigMap.get( HeaderResource.HEADER_CONFIG_DOJO_PARAM_DEBUGALLCOSTS );
        String dojoParamPreventBackBtnFix = (String)dojoConfigMap.get( HeaderResource.HEADER_CONFIG_DOJO_PARAM_PREVENT_BACKBUTTON_FIX );
        String dojoParams = (String)dojoConfigMap.get( HeaderResource.HEADER_CONFIG_DOJO_PARAMS );
        if ( dojoParamDebug != null || dojoParamDebugAtAllCosts != null || dojoParamPreventBackBtnFix != null || dojoParams != null )
        {
            StringBuffer dojoConfigContent = new StringBuffer();
            boolean addedMembers = false;
            if ( dojoParams != null && dojoParams.length() > 0 )
            {
                dojoConfigContent.append( dojoParams );
                addedMembers = true;
            }
            if ( dojoParamDebug != null && dojoParamDebug.length() > 0 )
            {
                if ( addedMembers )
                {
                    dojoConfigContent.append( ", " );
                }
                dojoConfigContent.append( "isDebug: " ).append( dojoParamDebug ) ;
                addedMembers = true;
            }
            if ( dojoParamDebugAtAllCosts != null && dojoParamDebugAtAllCosts.length() > 0 )
            {
                if ( addedMembers )
                {
                    dojoConfigContent.append( ", " );
                }
                dojoConfigContent.append( "debugAtAllCosts: " ).append( dojoParamDebugAtAllCosts ) ;
                addedMembers = true;
            }
            if ( dojoParamPreventBackBtnFix != null && dojoParamPreventBackBtnFix.length() > 0 )
            {
                if ( addedMembers )
                {
                    dojoConfigContent.append( ", " );
                }
                dojoConfigContent.append( "preventBackButtonFix: " ).append( dojoParamPreventBackBtnFix ) ;
                addedMembers = true;
            }
            if ( addedMembers )
            {
                dojoConfigContent.append( ", " );
            }
            dojoConfigContent.append( HeaderResource.HEADER_INTERNAL_JETSPEED_VAR_NAME ).append( ": {}" ) ;
            addedMembers = true;
           
            if ( canAddHeaderNamedResourceFragment( HeaderResource.HEADER_CONFIG_DOJO_PARAMS, namedResourcesAddedFragmentsDefault, registryContent ) )
            {
                String dojoParamContent = dojoConfigContent.toString();
                if ( registryContent[0] != null )
                {
                    dojoParamContent = registryContent[0];
                }
                if ( dojoParamContent.length() > 0 )
                {
                    namedResourcesDefault.put( HeaderResource.HEADER_SECTION_DOJO_PARAMETERS, ( "    var djConfig = {" + dojoParamContent + "};" + EOL ) );
                }
            }
            registerAndOrderNamedHeaderResource( HeaderResource.HEADER_SECTION_DOJO_PARAMETERS, HeaderResource.HEADER_TYPE_SCRIPT_BLOCK_START, dojoEnableName, headerDynamicConfigurationDefault );
        }
       
        // dojo preinit - for automatically added members to djConfig (eg. djConfig.baseScriptUri="...")
        //    - adding to order only at this point
        //    - if header contains content, generated content will not be added
        registerAndOrderNamedHeaderResource( HeaderResource.HEADER_SECTION_DOJO_PREINIT, null, dojoEnableName, headerDynamicConfigurationDefault );
       
        // dojo config - for adding members to djConfig (eg. djConfig.parseWidgets=false)
        //    - adding to order only at this point
        registerAndOrderNamedHeaderResource( HeaderResource.HEADER_SECTION_DOJO_CONFIG, null, dojoEnableName, headerDynamicConfigurationDefault );
       
        // dojo init - script tag for dojo.js
        //    - adding to order only at this point
        //    - if header contains content, generated content will not be added
        registerAndOrderNamedHeaderResource( HeaderResource.HEADER_SECTION_DOJO_INIT, HeaderResource.HEADER_TYPE_SCRIPT_TAG, dojoEnableName, headerDynamicConfigurationDefault );
       
        // dojo requires - core libraries
        List dojoRequiresCore = (List)dojoConfigMap.get( HeaderResource.HEADER_CONFIG_DOJO_REQUIRES_CORE );
        if ( dojoRequiresCore != null && dojoRequiresCore.size() > 0 )
        {
            StringBuffer dojoRequiresContent = new StringBuffer();
            Iterator dojoRequiresCoreIter = dojoRequiresCore.iterator();
            while ( dojoRequiresCoreIter.hasNext() )
            {
                String dojoReq = (String)dojoRequiresCoreIter.next();
                if ( dojoReq != null && dojoReq.length() > 0 )
                {
                    if ( canAddHeaderNamedResourceFragment( dojoReq, namedResourcesAddedFragmentsDefault, registryContent ) )
                    {
                        if ( registryContent[0] != null )
                        {
                            String dojoReqFromRegistry = HeaderResourceLib.makeJavascriptStatement( registryContent[0], "    ", true );
                            if ( dojoReqFromRegistry.length() > 0 )
                            {
                                dojoRequiresContent.append( registryContent[0] );
                            }
                        }
                        else
                        {
                            dojoRequiresContent.append( "    dojo.require(\"").append( dojoReq ).append( "\");" ).append( EOL );
                        }
                    }
                }
            }
            namedResourcesDefault.put( HeaderResource.HEADER_SECTION_DOJO_REQUIRES_CORE, dojoRequiresContent.toString() );
            registerAndOrderNamedHeaderResource( HeaderResource.HEADER_SECTION_DOJO_REQUIRES_CORE, null, dojoEnableName, headerDynamicConfigurationDefault );
        }
       
        // dojo modules path definition
        List dojoModulesPath = (List)dojoConfigMap.get( HeaderResource.HEADER_CONFIG_DOJO_MODULES_PATH );
        if ( dojoModulesPath != null && dojoModulesPath.size() > 0 )
        {
            StringBuffer dojoModulesPathContent = new StringBuffer();
            boolean addedContent = false;
            Iterator dojoModulesPathIter = dojoModulesPath.iterator();
            while ( dojoModulesPathIter.hasNext() )
            {
                String dojoModule = (String)dojoModulesPathIter.next();
                if ( dojoModule != null && dojoModule.length() > 0 )
                {
                    if ( canAddHeaderNamedResourceFragment( dojoModule, namedResourcesAddedFragmentsDefault, registryContent ) )
                    {
                        String dojoModuleContent = null;
                        if ( registryContent[0] != null )
                        {
                            dojoModuleContent = registryContent[0];
                        }
                        else
                        {
                            dojoModuleContent = dojoModule;
                        }
                        dojoModuleContent = HeaderResourceLib.makeJavascriptStatement( dojoModuleContent, "    ", true );
                        if ( dojoModuleContent.length() > 0 )
                        {
                            dojoModulesPathContent.append( dojoModuleContent );
                            addedContent = true;
                        }
                    }
                }
            }
            if ( addedContent )
            {
                namedResourcesDefault.put( HeaderResource.HEADER_SECTION_DOJO_MODULES_PATH, dojoModulesPathContent.toString() );
                registerAndOrderNamedHeaderResource( HeaderResource.HEADER_SECTION_DOJO_MODULES_PATH, null, dojoEnableName, headerDynamicConfigurationDefault );
            }
        }
       
        // dojo modules namespace definition
        List dojoModulesNamespace = (List)dojoConfigMap.get( HeaderResource.HEADER_CONFIG_DOJO_MODULES_NAMESPACE );
        if ( dojoModulesNamespace != null && dojoModulesNamespace.size() > 0 )
        {
            StringBuffer dojoModulesNamespaceContent = new StringBuffer();
            boolean addedContent = false;
            Iterator dojoModulesNamespaceIter = dojoModulesNamespace.iterator();
            while ( dojoModulesNamespaceIter.hasNext() )
            {
                String dojoModuleWidget = (String)dojoModulesNamespaceIter.next();
                if ( dojoModuleWidget != null && dojoModuleWidget.length() > 0 )
                {
                    if ( canAddHeaderNamedResourceFragment( dojoModuleWidget, namedResourcesAddedFragmentsDefault, registryContent ) )
                    {
                        String dojoModuleContent = null;
                        if ( registryContent[0] != null )
                        {
                            dojoModuleContent = registryContent[0];
                        }
                        else
                        {
                            dojoModuleContent = dojoModuleWidget;
                        }
                        dojoModuleContent = HeaderResourceLib.makeJavascriptStatement( dojoModuleContent, "    ", true );
                        if ( dojoModuleContent.length() > 0 )
                        {
                            dojoModulesNamespaceContent.append( dojoModuleContent );
                            addedContent = true;
                        }
                    }
                }
            }
            if ( addedContent )
            {
                namedResourcesDefault.put( HeaderResource.HEADER_SECTION_DOJO_MODULES_NAMESPACE, dojoModulesNamespaceContent.toString() );
                // registerAndOrderNamedHeaderResource called below
            }
        }
       
        // dojo requires - module libraries (from add-on modules)
        List dojoRequiresModules = (List)dojoConfigMap.get( HeaderResource.HEADER_CONFIG_DOJO_REQUIRES_MODULES );
        if ( dojoRequiresModules != null && dojoRequiresModules.size() > 0 )
        {
            StringBuffer dojoRequiresContent = new StringBuffer();
            Iterator dojoRequiresModulesIter = dojoRequiresModules.iterator();
            while ( dojoRequiresModulesIter.hasNext() )
            {
                String dojoReq = (String)dojoRequiresModulesIter.next();
                if ( dojoReq != null && dojoReq.length() > 0 )
                {
                    if ( canAddHeaderNamedResourceFragment( dojoReq, namedResourcesAddedFragmentsDefault, registryContent ) )
                    {
                        if ( registryContent[0] != null )
                        {
                            String dojoReqFromRegistry = HeaderResourceLib.makeJavascriptStatement( registryContent[0], "    ", true );
                            if ( dojoReqFromRegistry.length() > 0 )
                            {
                                dojoRequiresContent.append( registryContent[0] );
                            }
                        }
                        else
                        {
                            dojoRequiresContent.append( "    dojo.require(\"").append( dojoReq ).append( "\");" ).append( EOL );
                        }
                    }
                }
            }
            namedResourcesDefault.put( HeaderResource.HEADER_SECTION_DOJO_REQUIRES_MODULES, dojoRequiresContent.toString() );
            registerAndOrderNamedHeaderResource( HeaderResource.HEADER_SECTION_DOJO_REQUIRES_MODULES, null, dojoEnableName, headerDynamicConfigurationDefault );
        }
       
        // dojo writeincludes
        //    - adding to order only at this point
        //    - if header contains content, generated content will not be added
        registerAndOrderNamedHeaderResource( HeaderResource.HEADER_SECTION_DOJO_WRITEINCLUDES, HeaderResource.HEADER_TYPE_SCRIPT_BLOCK_START, dojoEnableName, headerDynamicConfigurationDefault );
       
        // dojo widget module - register widget packages (eg. dojo.widget.manager.registerWidgetPackage('jetspeed.ui.widget'))
        //    - default resource added above
        registerAndOrderNamedHeaderResource( HeaderResource.HEADER_SECTION_DOJO_MODULES_NAMESPACE, HeaderResource.HEADER_TYPE_SCRIPT_BLOCK_START, dojoEnableName, headerDynamicConfigurationDefault );
       
        // dojo style bodyexpand
        setNamedHeaderResourceProperties( HeaderResource.HEADER_SECTION_DOJO_STYLE_BODYEXPAND, HeaderResource.HEADER_TYPE_STYLE_BLOCK, dojoEnableName, headerDynamicConfigurationDefault );
       
        // dojo style bodyexpand noscroll
        setNamedHeaderResourceProperties( HeaderResource.HEADER_SECTION_DOJO_STYLE_BODYEXPAND_NOSCROLL, HeaderResource.HEADER_TYPE_STYLE_BLOCK, dojoEnableName, headerDynamicConfigurationDefault );
    }

   
    /**
     * Builds the portlet set defined in the context into a portlet tree.
     *
     * @return Unique Portlet Entity ID
     */
    public void build( RequestContext context ) throws JetspeedException, IOException
    {
        ContentPage page = context.getPage();
        if ( null == page )
        {
            throw new JetspeedException( "Failed to find PSML Pin ContentPageAggregator.build" );
        }

        ContentFragment root = page.getRootContentFragment();

        if ( root == null )
        {
            throw new JetspeedException( "No root ContentFragment found in ContentPage" );
        }

        // add named-resources and named-resources-added maps as request attributes
        Map dynamicConfigDefault = getHeaderDynamicConfigurationDefault();
        Map namedResourcesDefault = getHeaderNamedResourcesDefault();
        Map namedResourcesAddedFragmentsDefault = getHeaderNamedResourcesAddedFragmentsDefault();
       
        /*if ( log.isDebugEnabled() && namedResourcesDefault != null )
        {
            Iterator namedResourcesDefaultIter = namedResourcesDefault.entrySet().iterator();
            while ( namedResourcesDefaultIter.hasNext() )
            {
                Map.Entry rsrcEntry = (Map.Entry)namedResourcesDefaultIter.next();
                Object rsrcVal = rsrcEntry.getValue();
                log.debug( rsrcEntry.getKey().toString() + ": " + EOL + ( rsrcVal != null ? rsrcVal.toString() : "null" ) );
            }
        }*/
       
        if ( dynamicConfigDefault != null || namedResourcesDefault != null || namedResourcesAddedFragmentsDefault != null )
        {
            Map existingNamedResources = (Map)context.getAttribute( PortalReservedParameters.HEADER_NAMED_RESOURCE_ATTRIBUTE );
            if ( existingNamedResources == null )
            {
                if ( dynamicConfigDefault == null )
                {
                    context.setAttribute( PortalReservedParameters.HEADER_CONFIGURATION_ATTRIBUTE, new HashMap() );
                }
                else
                {
                    HashMap dynamicConfig = new HashMap();
                    Iterator hConfigEntryIter = dynamicConfigDefault.entrySet().iterator();
                    while ( hConfigEntryIter.hasNext() )
                    {
                        Map.Entry hConfigEntry = (Map.Entry)hConfigEntryIter.next();
                        Object hConfigKey = hConfigEntry.getKey();
                        Object hConfigVal = hConfigEntry.getValue();
                        if ( hConfigVal instanceof Map )
                        {
                            dynamicConfig.put( hConfigKey, new HashMap( (Map)hConfigVal ) );
                        }
                        else if ( hConfigVal instanceof List )
                        {
                            dynamicConfig.put( hConfigKey, new ArrayList( (List)hConfigVal ) );
                        }
                        else
                        {
                            dynamicConfig.put( hConfigKey, hConfigVal );
                        }
                    }
                    context.setAttribute( PortalReservedParameters.HEADER_CONFIGURATION_ATTRIBUTE, dynamicConfig );
                }
               
                if ( namedResourcesDefault != null )
                {
                    context.setAttribute( PortalReservedParameters.HEADER_NAMED_RESOURCE_ATTRIBUTE, new HashMap( namedResourcesDefault ) );
                }
                if ( namedResourcesAddedFragmentsDefault != null )
                {
                    context.setAttribute( PortalReservedParameters.HEADER_NAMED_RESOURCE_ADDED_FRAGMENTS_ATTRIBUTE, new HashMap( namedResourcesAddedFragmentsDefault ) );
                }
            }
        }
        if ( getHeaderResourceRegistry() != null )
        {
            context.setAttribute( PortalReservedParameters.HEADER_NAMED_RESOURCE_REGISTRY_ATTRIBUTE, getHeaderResourceRegistry() );
        }
       
        // handle maximized state
        boolean atLeastOneHasHeaderPhase = false;
        NavigationalState nav = context.getPortalURL().getNavigationalState();
        PortletWindow window = nav.getMaximizedWindow();
        if ( null != window )
        {
            ContentFragment maxedContentFragment = page.getContentFragmentById( window.getId().toString() );
            if ( maxedContentFragment != null )
            {
                atLeastOneHasHeaderPhase = renderHeaderFragment( context, maxedContentFragment );
            }
        }
        else
        {
            atLeastOneHasHeaderPhase = aggregateAndRender( root, context, page );
        }
       
        if ( atLeastOneHasHeaderPhase )
        {
           
        }
    }

    protected boolean aggregateAndRender( ContentFragment fragment, RequestContext context, ContentPage page )
            throws FailedToRenderFragmentException
    {
        boolean atLeastOneHasHeaderPhase = false;
        boolean hasHeaderPhase = false;
        if ( fragment.getContentFragments() != null && fragment.getContentFragments().size() > 0 )
        {
            Iterator children = fragment.getContentFragments().iterator();
            while (children.hasNext())
            {
                ContentFragment child = (ContentFragment) children.next();
                if ( ! "hidden".equals( fragment.getState() ) )
                {
                    hasHeaderPhase = aggregateAndRender( child, context, page );
                    if ( hasHeaderPhase )
                    {
                        atLeastOneHasHeaderPhase = true;
                    }
                }
            }
        }
        hasHeaderPhase = renderHeaderFragment( context, fragment );
        if ( hasHeaderPhase )
        {
            atLeastOneHasHeaderPhase = true;
        }
        return atLeastOneHasHeaderPhase;
    }
   
    protected boolean renderHeaderFragment( RequestContext context, ContentFragment fragment )
    {
        try
        {
            if ( !fragment.getType().equals( ContentFragment.LAYOUT ) )
            {
                PortletWindow portletWindow = getPortletWindowAccessor().getPortletWindow( fragment );
                PortletDefinition pd = portletWindow.getPortletEntity().getPortletDefinition();
                if ( pd != null && getPortletFactory().isPortletApplicationRegistered((PortletApplication)pd.getPortletApplicationDefinition() ) )
                {
                    String portletApplicationContextPath = pd.getPortletApplicationDefinition().getWebApplicationDefinition().getContextRoot();
                    Portlet portlet = getPortletFactory().getPortletInstance( context.getConfig().getServletContext().getContext( portletApplicationContextPath ), pd ).getRealPortlet();           
                    if ( portlet != null && portlet instanceof SupportsHeaderPhase )
                    {
                        log.debug( "renderHeaderFragment: " + pd.getName() + " supports header phase" );
                       
                        HeaderResource hr = getHeaderResourceFactory().getHeaderResource( context, this.baseUrlAccess, isDesktop(), getHeaderConfiguration() );
                        PortletHeaderRequest headerRequest = new PortletHeaderRequestImpl( context, portletWindow, portletApplicationContextPath );
                        PortletHeaderResponse headerResponse = new PortletHeaderResponseImpl( context, hr, isDesktop(), getHeaderConfiguration(), getHeaderResourceRegistry() );
                        ((SupportsHeaderPhase)portlet).doHeader( headerRequest, headerResponse );
                        return true;
                    }
                }
            }
            return false;
        }
        catch ( Exception e )
        {
            log.error( "renderHeaderFragment failed", e );
        }
        return false;
    }
   
    protected PortletFactory getPortletFactory()
    {
        return this.factory;
    }
    protected PortletWindowAccessor getPortletWindowAccessor()
    {
        return this.windowAccessor;
    }
    protected HeaderResourceFactory getHeaderResourceFactory()
    {
        return this.headerResourceFactory;
    }
    protected boolean isDesktop()
    {
        return this.isDesktop;
    }
    protected Map getHeaderConfiguration()
    {
        return this.headerConfiguration;
    }
    protected Map getHeaderResourceRegistry()
    {
        return this.headerResourceRegistry;
    }
    protected Map getHeaderDynamicConfigurationDefault()
    {
        return this.headerDynamicConfigurationDefault;
    }
    protected Map getHeaderNamedResourcesDefault()
    {
        return this.headerNamedResourcesDefault;
    }
    protected Map getHeaderNamedResourcesAddedFragmentsDefault()
    {
        return this.headerNamedResourcesAddedFragmentsDefault;
    }
    protected BasePortalURL getBaseUrlAccess()
    {
        return this.baseUrlAccess;
    }
}
TOP

Related Classes of org.apache.jetspeed.aggregator.impl.HeaderAggregatorImpl

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.