portals-jetspeed-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From smi...@apache.org
Subject svn commit: r584855 [2/2] - /portals/jetspeed-2/branches/JETSPEED-2.1.3/components/portal/src/java/org/apache/jetspeed/aggregator/impl/HeaderAggregatorImpl.java
Date Mon, 15 Oct 2007 19:12:30 GMT

Modified: portals/jetspeed-2/branches/JETSPEED-2.1.3/components/portal/src/java/org/apache/jetspeed/aggregator/impl/HeaderAggregatorImpl.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/branches/JETSPEED-2.1.3/components/portal/src/java/org/apache/jetspeed/aggregator/impl/HeaderAggregatorImpl.java?rev=584855&r1=584854&r2=584855&view=diff
==============================================================================
--- portals/jetspeed-2/branches/JETSPEED-2.1.3/components/portal/src/java/org/apache/jetspeed/aggregator/impl/HeaderAggregatorImpl.java (original)
+++ portals/jetspeed-2/branches/JETSPEED-2.1.3/components/portal/src/java/org/apache/jetspeed/aggregator/impl/HeaderAggregatorImpl.java Mon Oct 15 12:12:28 2007
@@ -1,1169 +1,1181 @@
-/*
+/*
  * 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
-        boolean dojoDebugEnabled = false;
-        String dojoParamDebug = (String)dojoConfigMap.get( HeaderResource.HEADER_CONFIG_DOJO_PARAM_ISDEBUG );
-        String dojoParamDebugAtAllCosts = null;
-        if ( dojoParamDebug != null )
-        	dojoParamDebug = dojoParamDebug.toLowerCase();
-        if ( dojoParamDebug == null || dojoParamDebug.length() == 0 || dojoParamDebug.equals( "false" ) )
-        {
-        	dojoParamDebug = null;
-        }
-        else if ( dojoParamDebug.equals( "true" ) )
-        {
-        	dojoDebugEnabled = true;
-        	dojoParamDebugAtAllCosts = (String)dojoConfigMap.get( HeaderResource.HEADER_CONFIG_DOJO_PARAM_DEBUGALLCOSTS );
-        	if ( dojoParamDebugAtAllCosts != null )
-        	{
-        		dojoParamDebugAtAllCosts = dojoParamDebugAtAllCosts.toLowerCase();
-        		if ( ! dojoParamDebugAtAllCosts.equals( "true") )
-        		{
-        			dojoParamDebugAtAllCosts = null;
-        		}
-        	}
-        }
-        
-        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 )
-        {
-        	HashMap addedReqs = null;
-        	if ( dojoDebugEnabled )
-        		addedReqs = new HashMap();
-            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 );
-                            if ( dojoDebugEnabled )
-                            	addedReqs.put( dojoReq, dojoReq ); 
-                        }
-                    }
-                }
-            }
-            if ( dojoDebugEnabled )
-            {
-            	if ( addedReqs.get( HeaderResource.HEADER_DEBUG_REQUIRES ) == null )
-            	{
-            		dojoRequiresContent.append( "    dojo.require(\"").append( HeaderResource.HEADER_DEBUG_REQUIRES ).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;
-    }
-}
+ * 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 ) )
+        {

[... 706 lines stripped ...]


---------------------------------------------------------------------
To unsubscribe, e-mail: jetspeed-dev-unsubscribe@portals.apache.org
For additional commands, e-mail: jetspeed-dev-help@portals.apache.org


Mime
View raw message