You are viewing a plain text version of this content. The canonical link for it is here.
Posted to jetspeed-dev@portals.apache.org by sm...@apache.org on 2006/10/30 23:35:57 UTC

svn commit: r469307 [2/3] - in /portals/jetspeed-2/trunk: applications/gems/src/java/org/apache/portals/gems/dojo/ applications/j2-admin/src/java/org/apache/jetspeed/portlets/security/permissions/ applications/j2-admin/src/webapp/WEB-INF/ applications/...

Modified: portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/aggregator/impl/HeaderAggregatorImpl.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/aggregator/impl/HeaderAggregatorImpl.java?view=diff&rev=469307&r1=469306&r2=469307
==============================================================================
--- portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/aggregator/impl/HeaderAggregatorImpl.java (original)
+++ portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/aggregator/impl/HeaderAggregatorImpl.java Mon Oct 30 14:35:55 2006
@@ -17,25 +17,34 @@
 
 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.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.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;
 
@@ -48,19 +57,677 @@
  */
 public class HeaderAggregatorImpl implements PageAggregator
 {
-    private final static Log log = LogFactory.getLog(HeaderAggregatorImpl.class);
+    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;
     
-    public HeaderAggregatorImpl(PortletFactory factory, PortletWindowAccessor windowAccessor, HeaderResourceFactory headerResourceFactory)
+    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 )
+    {
+        this( factory, windowAccessor, headerResourceFactory, isDesktop, headerConfiguration, headerResourceRegistry, null );
+    }
+    
+    public HeaderAggregatorImpl( PortletFactory factory,
+                                 PortletWindowAccessor windowAccessor,
+                                 HeaderResourceFactory headerResourceFactory,
+                                 boolean isDesktop,
+                                 Map headerConfiguration,
+                                 Map headerResourceRegistry,
+                                 BasePortalURL baseUrlAccess )
     {
         this.factory = factory;
         this.windowAccessor = windowAccessor;
         this.headerResourceFactory = headerResourceFactory;
+        this.isDesktop = isDesktop;
+        this.baseUrlAccess = baseUrlAccess;
+        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
+     */
+    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 );
+                }
+            }
+        }
+        
+        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 = (String)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;
+        }
+        return false;
+    }
+    
+    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 );
+            if ( headerTypeId < 0 )
+            {
+                log.error( "HeaderAggregatorImpl.registerAndOrderNamedHeaderResource() ignoring specification of unknown header section type; header-section-name=" + headerName + " header-section-type=" + headerType );
+            }
+            
+            if ( ( headerTypeId >= 0 ) || ( headerReqFlag != null && headerReqFlag.length() > 0 ) )
+            {
+                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 );
+            String registryContentVal = (String)this.headerResourceRegistry.get( headerFragmentName );
+            registryContent[0] = registryContentVal;
+            if ( registryContentVal != null )
+            {
+                this.headerResourceRegistry.remove( headerFragmentName );
+            }
+            return true;
+        }
+        registryContent[0] = null;
+        return false;
+    }
+    
+    protected String makeJavascriptStatement( String statement, String indent, boolean addEOL )
+    {
+        StringBuffer statementOut = new StringBuffer();
+        if ( statement != null )
+        {
+            statement = statement.trim();
+            if ( statement.length() > 0 )
+            {
+                if ( indent != null )
+                {
+                    statementOut.append( indent );
+                }
+                statementOut.append( statement );
+                if ( statement.charAt( statement.length()-1 ) != ';' )
+                {
+                    statementOut.append( ";" );
+                }
+                if ( addEOL )
+                {
+                    statementOut.append( EOL );
+                }
+            }
+        }
+        return statementOut.toString();
+    }
+    
+    
+    /**
+     * 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.size() > 0 )
+        {
+            String[] registryContent = new String[] { null };
+            
+            // add dojo.enable and dojo.path to dynamic configuration
+            String dojoEnableName = "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( "dojo.path" );
+            if ( dojoPath == null || dojoPath.length() == 0 )
+            {
+                dojoPath = "/javascript/dojo/";
+            }
+            headerDynamicConfigurationDefault.put( "dojo.path", dojoPath );
+            
+            // dojo parameters - djConfig parameters
+            String dojoParamDebug = (String)dojoConfigMap.get( "dojo.parameter.isDebug" );
+            String dojoParamDebugAtAllCosts = (String)dojoConfigMap.get( "dojo.parameter.debugAtAllCosts" );
+            String dojoParams = (String)dojoConfigMap.get( "dojo.parameters" );
+            if ( dojoParamDebug != null || dojoParamDebugAtAllCosts != 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 ( canAddHeaderNamedResourceFragment( "dojo.parameters", 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( "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 = 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 module definition
+            List dojoModules = (List)dojoConfigMap.get( "dojo.modules" );
+            if ( dojoModules != null && dojoModules.size() > 0 )
+            {
+                StringBuffer dojoModulesContent = new StringBuffer();
+                boolean addedContent = false;
+                Iterator dojoModulesIter = dojoModules.iterator();
+                while ( dojoModulesIter.hasNext() )
+                {
+                    String dojoModule = (String)dojoModulesIter.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 = makeJavascriptStatement( dojoModuleContent, "    ", true );
+                            if ( dojoModuleContent.length() > 0 )
+                            {
+                                dojoModulesContent.append( dojoModuleContent );
+                                addedContent = true;
+                            }
+                        }
+                    }
+                }
+                if ( addedContent )
+                {
+                    namedResourcesDefault.put( HeaderResource.HEADER_SECTION_DOJO_MODULES_PATH, dojoModulesContent.toString() );
+                    registerAndOrderNamedHeaderResource( HeaderResource.HEADER_SECTION_DOJO_MODULES_PATH, null, dojoEnableName, headerDynamicConfigurationDefault );
+                }
+            }
+            
+            // dojo widget module definition
+            List dojoModulesWidget = (List)dojoConfigMap.get( "dojo.modules.widget" );
+            if ( dojoModulesWidget != null && dojoModulesWidget.size() > 0 )
+            {
+                StringBuffer dojoModulesWidgetContent = new StringBuffer();
+                boolean addedContent = false;
+                Iterator dojoModulesWidgetIter = dojoModulesWidget.iterator();
+                while ( dojoModulesWidgetIter.hasNext() )
+                {
+                    String dojoModuleWidget = (String)dojoModulesWidgetIter.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 = makeJavascriptStatement( dojoModuleContent, "    ", true );
+                            if ( dojoModuleContent.length() > 0 )
+                            {
+                                dojoModulesWidgetContent.append( dojoModuleContent );
+                                addedContent = true;
+                            }
+                        }
+                    }
+                }
+                if ( addedContent )
+                {
+                    namedResourcesDefault.put( HeaderResource.HEADER_SECTION_DOJO_MODULES_NAMESPACE, dojoModulesWidgetContent.toString() );
+                    // registerAndOrderNamedHeaderResource called below
+                }
+            }
+            
+            // dojo requires - module libraries (from add-on modules)
+            List dojoRequiresModules = (List)dojoConfigMap.get( "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 = 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 - 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_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 );
+            
+        }   // if ( dojoConfigMap != null && dojoConfigMap.size() > 0 )
     }
 
+    
     /**
      * Builds the portlet set defined in the context into a portlet tree.
      * 
@@ -69,83 +736,204 @@
     public void build( RequestContext context ) throws JetspeedException, IOException
     {
         ContentPage page = context.getPage();
-        if (null == page)
+        if ( null == page )
         {
-            throw new JetspeedException("Failed to find PSML Pin ContentPageAggregator.build");
+            throw new JetspeedException( "Failed to find PSML Pin ContentPageAggregator.build" );
         }
 
         ContentFragment root = page.getRootContentFragment();
 
-        if (root == null)
+        if ( root == null )
         {
-            throw new JetspeedException("No root ContentFragment found in ContentPage");
+            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)
+        if ( null != window )
         {
-            ContentFragment maxedContentFragment = page.getContentFragmentById(window.getId().toString());
-            if (maxedContentFragment != null)
+            ContentFragment maxedContentFragment = page.getContentFragmentById( window.getId().toString() );
+            if ( maxedContentFragment != null )
             {
-                renderHeaderFragment(context, maxedContentFragment);
+                atLeastOneHasHeaderPhase = renderHeaderFragment( context, maxedContentFragment );
             }
         }
         else
         {
-            aggregateAndRender(root, context, page);
+            atLeastOneHasHeaderPhase = aggregateAndRender( root, context, page );
         }
         
+        if ( atLeastOneHasHeaderPhase )
+        {
+            
+        }
     }
 
-    protected void aggregateAndRender( ContentFragment fragment, RequestContext context, ContentPage page )
+    protected boolean aggregateAndRender( ContentFragment fragment, RequestContext context, ContentPage page )
             throws FailedToRenderFragmentException
     {
-
-        if (fragment.getContentFragments() != null && fragment.getContentFragments().size() > 0)
+        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()))
+                if ( ! "hidden".equals( fragment.getState() ) )
                 {
-                    aggregateAndRender(child, context, page);
+                    hasHeaderPhase = aggregateAndRender( child, context, page );
+                    if ( hasHeaderPhase )
+                    {
+                        atLeastOneHasHeaderPhase = true;
+                    }
                 }
             }
         }
-        renderHeaderFragment(context, fragment);
+        hasHeaderPhase = renderHeaderFragment( context, fragment );
+        if ( hasHeaderPhase )
+        {
+            atLeastOneHasHeaderPhase = true;
+        }
+        return atLeastOneHasHeaderPhase;
     }
     
-    protected void renderHeaderFragment(RequestContext context, ContentFragment fragment)
+    protected boolean renderHeaderFragment( RequestContext context, ContentFragment fragment )
     {
         try
         {
-            if (fragment.getType().equals(ContentFragment.LAYOUT))
-                return;
+            if ( fragment.getType().equals( ContentFragment.LAYOUT ) )
+            {
+                return false;
+            }
             
-            PortletWindow portletWindow = windowAccessor.getPortletWindow(fragment);
+            PortletWindow portletWindow = getPortletWindowAccessor().getPortletWindow( fragment );
             PortletDefinition pd = portletWindow.getPortletEntity().getPortletDefinition();
-            //portletWindow.getPortletEntity().getPreferenceSet().get
             String portletApplicationContextPath = pd.getPortletApplicationDefinition().getWebApplicationDefinition().getContextRoot();
-            Portlet portlet = factory.getPortletInstance(context.getConfig().getServletContext().getContext(portletApplicationContextPath), pd).getRealPortlet();            
-            if (portlet instanceof SupportsHeaderPhase)
+            Portlet portlet = getPortletFactory().getPortletInstance( context.getConfig().getServletContext().getContext( portletApplicationContextPath ), pd ).getRealPortlet();            
+            if ( portlet instanceof SupportsHeaderPhase )
             {
-                System.out.println("HEADER AGGREGATOR: supports header phase: " + pd.getName());
+                log.debug( "renderHeaderFragment: " + pd.getName() + " supports header phase" );
                 
-                HeaderResource hr = headerResourceFactory.getHeaderResouce(context);
-                PortletHeaderRequest headerRequest = new PortletHeaderRequestImpl(context, portletWindow, portletApplicationContextPath);                
-                PortletHeaderResponse headerResponse = new PortletHeaderResponseImpl(context, hr);
-                ((SupportsHeaderPhase)portlet).doHeader(headerRequest, headerResponse);                
+                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;
             }
         }
-        catch (Exception e)
+        catch ( Exception e )
         {
-            log.equals(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;
+    }
 }

Modified: portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/aggregator/impl/PortletHeaderRequestImpl.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/aggregator/impl/PortletHeaderRequestImpl.java?view=diff&rev=469307&r1=469306&r2=469307
==============================================================================
--- portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/aggregator/impl/PortletHeaderRequestImpl.java (original)
+++ portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/aggregator/impl/PortletHeaderRequestImpl.java Mon Oct 30 14:35:55 2006
@@ -20,6 +20,8 @@
 import org.apache.jetspeed.portlet.PortletHeaderRequest;
 import org.apache.jetspeed.request.RequestContext;
 import org.apache.pluto.core.impl.PortletPreferencesImpl;
+import org.apache.pluto.om.common.ParameterSet;
+import org.apache.pluto.om.common.Parameter;
 import org.apache.pluto.om.window.PortletWindow;
 
 
@@ -28,8 +30,9 @@
     private RequestContext requestContext;
     private String portletApplicationContextPath;
     private PortletWindow portletWindow;
+    private ParameterSet initParamSet;
     
-    public PortletHeaderRequestImpl(RequestContext requestContext, PortletWindow portletWindow, String portletApplicationContextPath)
+    public PortletHeaderRequestImpl( RequestContext requestContext, PortletWindow portletWindow, String portletApplicationContextPath )
     {
         this.requestContext = requestContext;
         this.portletApplicationContextPath = portletApplicationContextPath;
@@ -39,20 +42,31 @@
     public String getPortalContextPath()
     {
         return requestContext.getRequest().getContextPath();
-    }
+    }    
     
-    public boolean isDesktopEncoder()
+    public PortletPreferences getPreferences()
     {
-        String requestEncoder = (String)requestContext.getRequest().getParameter("encoder");
-        return((requestEncoder == null) || !requestEncoder.equals("desktop")) ? false : true;
+        return new PortletPreferencesImpl(org.apache.pluto.Constants.METHOD_NOOP, this.portletWindow.getPortletEntity());
     }
     
-    
-    public PortletPreferences getPreferences()
+    public String getInitParameter( String name )
     {
-        return new PortletPreferencesImpl(org.apache.pluto.Constants.METHOD_NOOP, this.portletWindow.getPortletEntity());
+        ParameterSet iParamSet = this.initParamSet;
+        if ( iParamSet == null )
+        {
+            iParamSet = this.portletWindow.getPortletEntity().getPortletDefinition().getInitParameterSet();
+            this.initParamSet = iParamSet;
+        }
+        if ( iParamSet != null )
+        {
+            Parameter initParam = iParamSet.get( name );
+            if ( initParam != null )
+            {
+                return initParam.getValue();
+            }
+        }
+        return null;
     }
-
     
     /**
      * @return Returns the portletApplicationContextPath.

Modified: portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/aggregator/impl/PortletHeaderResponseImpl.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/aggregator/impl/PortletHeaderResponseImpl.java?view=diff&rev=469307&r1=469306&r2=469307
==============================================================================
--- portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/aggregator/impl/PortletHeaderResponseImpl.java (original)
+++ portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/aggregator/impl/PortletHeaderResponseImpl.java Mon Oct 30 14:35:55 2006
@@ -17,6 +17,7 @@
 
 import java.io.BufferedReader;
 import java.io.StringReader;
+import java.util.Map;
 
 import javax.portlet.PortletException;
 import javax.servlet.RequestDispatcher;
@@ -37,22 +38,21 @@
     private HeaderResource hr;
     private String tempContent;
     
-    public PortletHeaderResponseImpl(RequestContext requestContext, HeaderResource hr)
+    private boolean isDesktop;
+    
+    private Map headerConfiguration;
+    private Map headerResourceRegistry;
+    
+    public PortletHeaderResponseImpl( RequestContext requestContext, HeaderResource hr, boolean isDesktop, Map headerConfiguration, Map headerResourceRegistry )
     {
         this.requestContext = requestContext;
         this.hr = hr;
-    }
+        this.isDesktop = isDesktop;
+        
+        this.headerConfiguration = headerConfiguration;
+        this.headerResourceRegistry = headerResourceRegistry;
+    }    
 
-    public HeaderResource getHeaderResource()
-    {
-        return this.hr;
-    }
-    
-    public String getContent()
-    {
-        return tempContent; 
-    }
-    
     public void include(PortletHeaderRequest request, PortletHeaderResponse response, String headerResource)
     throws PortletException
     {
@@ -81,5 +81,35 @@
         {
             throw new PortletException(e);
         }
+    }
+    
+    protected RequestContext getRequestContext()
+    {
+        return this.requestContext;
+    }
+    
+    public HeaderResource getHeaderResource()
+    {
+        return this.hr;
+    }
+    
+    public boolean isDesktop()
+    {
+        return this.isDesktop;
+    }
+    
+    public Map getHeaderConfiguration()
+    {
+        return this.headerConfiguration;
+    }
+    
+    public Map getHeaderResourceRegistry()
+    {
+        return this.headerResourceRegistry;
+    }
+    
+    public String getContent()
+    {
+        return tempContent; 
     }
 }

Modified: portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/desktop/impl/JetspeedDesktopContextImpl.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/desktop/impl/JetspeedDesktopContextImpl.java?view=diff&rev=469307&r1=469306&r2=469307
==============================================================================
--- portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/desktop/impl/JetspeedDesktopContextImpl.java (original)
+++ portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/desktop/impl/JetspeedDesktopContextImpl.java Mon Oct 30 14:35:55 2006
@@ -28,6 +28,8 @@
 
 import org.apache.jetspeed.container.url.BasePortalURL;
 import org.apache.jetspeed.desktop.JetspeedDesktopContext;
+import org.apache.jetspeed.headerresource.HeaderResource;
+import org.apache.jetspeed.headerresource.HeaderResourceLib;
 import org.apache.jetspeed.request.RequestContext;
 
 /**
@@ -38,88 +40,140 @@
  */
 public class JetspeedDesktopContextImpl implements JetspeedDesktopContext
 {
-    /** Jetspeed Request Context */
+    // Jetspeed Request Context
     RequestContext context;
     
-    /** base portal URL to override default URL server info from servlet */
+    // base portal url to override default url server info from servlet
     private BasePortalURL baseUrlAccess = null;
+    
     private String themeRootPath = null;
     private String theme = null;
     private String resourceName = null;
-        
-    public JetspeedDesktopContextImpl(RequestContext context, BasePortalURL baseUrlAccess, String theme, String themeRootPath, String resourceName)
+    
+    // ... save generated portal urls to avoid duplicate effort
+    private String portalBaseUrl;
+    private String portalUrl;
+    
+    private HeaderResource headerResource;
+    
+    public JetspeedDesktopContextImpl( RequestContext context, BasePortalURL baseUrlAccess, String theme, String themeRootPath, String resourceName, HeaderResource headerResource )
     {
         this.context = context;
         this.baseUrlAccess = baseUrlAccess;
         this.theme = theme;
         this.themeRootPath = themeRootPath;
         this.resourceName = resourceName;
+        this.headerResource = headerResource;
     }
     
-    public String getPortalResourceUrl(String relativePath)
-    {        
-        HttpServletRequest request = context.getRequest();
-        HttpServletResponse response = context.getResponse();
-        
-        // only rewrite a non-absolute url
-        if (relativePath != null && relativePath.indexOf("://") == -1 && relativePath.indexOf("mailto:") == -1)            
-        {
-            StringBuffer path = new StringBuffer();
-            if (this.baseUrlAccess == null)
-            {
-                return response.encodeURL(path.append(request.getScheme()).append("://").append(
-                request.getServerName()).append(":").append(request.getServerPort()).append(
-                request.getContextPath()).append(relativePath).toString());                
-            }
-            else
-            {
-                return response.encodeURL(path.append(baseUrlAccess.getServerScheme()).append("://").append(
-                        baseUrlAccess.getServerName()).append(":").append(baseUrlAccess.getServerPort()).append(
-                        request.getContextPath()).append(relativePath).toString());                                
-            }
-        }
-        else
+    
+    // get portal urls - each of these methods is copied from HeaderResourceImpl.java
+    
+    /**
+     * Portal base url ( e.g. http://localhost:8080/jetspeed )
+     * 
+     * @return portal base url
+     */
+    public String getPortalBaseUrl()
+    {
+        if ( this.portalBaseUrl == null )
         {
-            return relativePath;
+            this.portalBaseUrl = HeaderResourceLib.getPortalBaseUrl( context, this.baseUrlAccess );
         }
+        return this.portalBaseUrl;
     }
     
-    public String getPortalUrl(String relativePath)
-    {        
-        HttpServletRequest request = context.getRequest();
-        HttpServletResponse response = context.getResponse();
-
-        // only rewrite a non-absolute url
-        if (relativePath != null && relativePath.indexOf("://") == -1 && relativePath.indexOf("mailto:") == -1)            
+    /**
+     * Portal base url ( e.g. http://localhost:8080/jetspeed )
+     * 
+     * @return portal base url
+     */
+    public String getPortalBaseUrl( boolean encode )
+    {
+        String baseurl = getPortalBaseUrl();
+        if ( ! encode )
         {
-            StringBuffer path = new StringBuffer();
-            if (this.baseUrlAccess == null)
-            {
-                return response.encodeURL(path.append(request.getScheme()).append("://").append(
-                request.getServerName()).append(":").append(request.getServerPort()).append(
-                request.getContextPath()).append(request.getServletPath()).append(relativePath).toString());                
-            }
-            else
-            {
-                return response.encodeURL(path.append(baseUrlAccess.getServerScheme()).append("://").append(
-                        baseUrlAccess.getServerName()).append(":").append(baseUrlAccess.getServerPort()).append(
-                        request.getContextPath()).append(request.getServletPath()).append(relativePath).toString());                                
-            }
+            return baseurl;
         }
         else
         {
-            return relativePath;
+            return context.getResponse().encodeURL( baseurl );
+        }
+    }
+        
+    /**
+     * Portal base url with relativePath argument appended ( e.g. http://localhost:8080/jetspeed/javascript/dojo/ )
+     * 
+     * @return portal base url with relativePath argument appended
+     */
+    public String getPortalResourceUrl( String relativePath )
+    {
+        return getPortalResourceUrl( relativePath, false );
+    }
+    
+    /**
+     * Portal base url with relativePath argument appended ( e.g. http://localhost:8080/jetspeed/javascript/dojo/ )
+     * 
+     * @return portal base url with relativePath argument appended
+     */
+    public String getPortalResourceUrl( String relativePath, boolean encode )
+    {
+        return HeaderResourceLib.getPortalResourceUrl( relativePath, getPortalBaseUrl(), encode, context );
+    }
+    
+    /**
+     * Portal base servlet url ( e.g. http://localhost:8080/jetspeed/desktop/ )
+     * 
+     * @return portal base servlet url
+     */
+    public String getPortalUrl()
+    {
+        if ( this.portalUrl == null )
+        {
+            this.portalUrl = HeaderResourceLib.getPortalUrl( getPortalBaseUrl(), context );
         }
+        return this.portalUrl;
     }
     
-    public String getDesktopThemeResourceUrl(String relativePath)
+    /**
+     * Portal base servlet url ( e.g. http://localhost:8080/jetspeed/desktop/ )
+     * 
+     * @return portal base servlet url
+     */
+    public String getPortalUrl( boolean encode )
     {
-        return getPortalResourceUrl(getDesktopThemeResource(relativePath));
+        return getPortalUrl( null, encode );
+    }
+    
+    /**
+     * Portal base servlet url with relativePath argument appended ( e.g. http://localhost:8080/jetspeed/desktop/default-page.psml )
+     * 
+     * @return portal base servlet url with relativePath argument appended
+     */
+    public String getPortalUrl( String relativePath )
+    {
+        return getPortalUrl( relativePath, false );
+    }
+    
+    /**
+     * Portal base servlet url with relativePath argument appended ( e.g. http://localhost:8080/jetspeed/desktop/default-page.psml )
+     * 
+     * @return portal base servlet url with relativePath argument appended
+     */
+    public String getPortalUrl( String relativePath, boolean encode )
+    {
+        return HeaderResourceLib.getPortalResourceUrl( relativePath, getPortalUrl(), encode, context );
+    }
+    
+    
+    public String getDesktopThemeResourceUrl( String relativePath )
+    {
+        return getPortalResourceUrl( getDesktopThemeResource( relativePath ), false );
     }
 
-    public String getDesktopThemeResource(String relativePath)
+    public String getDesktopThemeResource( String relativePath )
     {
-        if (relativePath.startsWith("/"))
+        if ( relativePath.startsWith( "/" ) )
         {
             return themeRootPath + relativePath;
         }
@@ -131,7 +185,7 @@
 
     public String getDesktopThemeRootUrl()
     {
-        return getPortalResourceUrl(themeRootPath);
+        return getPortalResourceUrl( themeRootPath, false );
     }
     
     public String getDesktopTheme()
@@ -142,13 +196,13 @@
     public ResourceBundle getResourceBundle(Locale locale)
     {
         String resourceDirName = context.getConfig().getServletContext()
-                .getRealPath(getDesktopThemeResource(RESOURCES_DIRECTORY_NAME));
+                .getRealPath( getDesktopThemeResource( RESOURCES_DIRECTORY_NAME ) );
         File resourceDir = new File(resourceDirName);
         if (resourceName == null)
         {
-            throw new NullPointerException("The resource file is null.");
+            throw new NullPointerException( "The resource file is null." );
         }
-        if (!resourceDir.isDirectory())
+        if ( !resourceDir.isDirectory() )
         {
             throw new MissingResourceException(
                     "Can't find the resource directory: " + resourceDirName,
@@ -167,5 +221,10 @@
         }
         return ResourceBundle.getBundle(resourceName, locale,
                 new URLClassLoader(urls));
+    }
+    
+    public HeaderResource getHeaderResource()
+    {
+        return this.headerResource;
     }
 }

Modified: portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/desktop/impl/JetspeedDesktopImpl.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/desktop/impl/JetspeedDesktopImpl.java?view=diff&rev=469307&r1=469306&r2=469307
==============================================================================
--- portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/desktop/impl/JetspeedDesktopImpl.java (original)
+++ portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/desktop/impl/JetspeedDesktopImpl.java Mon Oct 30 14:35:55 2006
@@ -26,9 +26,12 @@
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.jetspeed.Jetspeed;
 import org.apache.jetspeed.container.url.BasePortalURL;
 import org.apache.jetspeed.desktop.JetspeedDesktop;
 import org.apache.jetspeed.desktop.JetspeedDesktopContext;
+import org.apache.jetspeed.headerresource.HeaderResource;
+import org.apache.jetspeed.headerresource.HeaderResourceFactory;
 import org.apache.jetspeed.om.page.Page;
 import org.apache.jetspeed.request.RequestContext;
 import org.springframework.web.context.ServletContextAware;
@@ -40,13 +43,17 @@
  * @version $Id: $
  */
 public class JetspeedDesktopImpl implements JetspeedDesktop, ServletContextAware
-{
+{    
     private static final String TEMPLATE_EXTENSION_ATTR = "template.extension";
 
     private static final String ID_ATTR = "id";
     
     private static final String RESOURCE_FILE_ATTR =  "resource.file";
 
+    private final static String EOL = "\r\n";   // html eol    
+    private final static String INIT_FUNCTION_NAME = "jetspeed.initializeDesktop";
+    private final static String DOJO_CONFIG_THEME_ROOT_URL_VAR_NAME = "djConfig.desktopThemeRootUrl";
+    
     private static final Log log = LogFactory.getLog( JetspeedDesktopImpl.class );
 
     /** the webapp relative root of all themes */
@@ -64,19 +71,23 @@
     /** spring-fed servlet context property */
     private ServletContext servletContext;
     
+    /** tool for directing output to html &lt;head&gt; */
+    private HeaderResourceFactory headerResourceFactory;
+    
     /** base portal URL to override default URL server info from servlet */
     private BasePortalURL baseUrlAccess = null;
     
-    public JetspeedDesktopImpl(String themesRoot, String defaultTheme, String defaultExtension)
+    public JetspeedDesktopImpl(String themesRoot, String defaultTheme, String defaultExtension, HeaderResourceFactory headerResourceFactory )
     {
-        this.themesRoot = themesRoot;
-        this.defaultTheme = defaultTheme;
-        this.defaultExtension = defaultExtension;
+        this( themesRoot, defaultTheme, defaultExtension, headerResourceFactory, null );
     }
 
-    public JetspeedDesktopImpl(String themesRoot, String defaultTheme, String defaultExtension, BasePortalURL baseUrlAccess)
+    public JetspeedDesktopImpl(String themesRoot, String defaultTheme, String defaultExtension, HeaderResourceFactory headerResourceFactory, BasePortalURL baseUrlAccess)
     {
-        this(themesRoot, defaultTheme, defaultExtension);
+        this.themesRoot = themesRoot;
+        this.defaultTheme = defaultTheme;
+        this.defaultExtension = defaultExtension;
+        this.headerResourceFactory = headerResourceFactory;
         this.baseUrlAccess = baseUrlAccess;
     }
     
@@ -91,13 +102,42 @@
         String path = getThemePath(theme);               
         try
         {
-            RequestDispatcher dispatcher = request.getRequest().getRequestDispatcher(path);                
+            RequestDispatcher dispatcher = request.getRequest().getRequestDispatcher(path);
+            
+            HeaderResource hr = getHeaderResourceFactory().getHeaderResouce( request );
+            
             JetspeedDesktopContext desktopContext = new JetspeedDesktopContextImpl(
-                    request, this.baseUrlAccess, theme,
-                    getThemeRootPath(theme), getResourceName(theme));
-            request.getRequest().setAttribute(JetspeedDesktopContext.DESKTOP_ATTRIBUTE, desktopContext);
-            request.getRequest().setAttribute("JS2RequestContext", request);
-            dispatcher.include(request.getRequest(), request.getResponse());
+                    request, this.baseUrlAccess, theme, getThemeRootPath( theme ), getResourceName( theme ), hr );
+            request.getRequest().setAttribute( JetspeedDesktopContext.DESKTOP_ATTRIBUTE, desktopContext );
+            request.getRequest().setAttribute( "JS2RequestContext", request );
+            request.getRequest().setAttribute( "JS2ComponentManager", Jetspeed.getComponentManager() );
+            
+            StringBuffer dojoConfigAddOn = new StringBuffer();
+            dojoConfigAddOn.append( "    " ).append( DOJO_CONFIG_THEME_ROOT_URL_VAR_NAME ).append( " = \"" ).append( desktopContext.getDesktopThemeRootUrl() ).append( "\";" );
+            hr.addHeaderSectionFragment( DOJO_CONFIG_THEME_ROOT_URL_VAR_NAME, HeaderResource.HEADER_SECTION_DOJO_CONFIG, dojoConfigAddOn.toString() );
+            
+            if ( hr.isHeaderSectionIncluded( HeaderResource.HEADER_SECTION_DESKTOP_STYLE_DESKTOPTHEME ) )
+            {
+                hr.setHeaderSectionType( HeaderResource.HEADER_SECTION_DESKTOP_STYLE_DESKTOPTHEME, HeaderResource.HEADER_TYPE_LINK_TAG );
+                StringBuffer desktopThemeStyleLink = new StringBuffer();
+                desktopThemeStyleLink.append( "<link rel=\"stylesheet\" type=\"text/css\" media=\"screen, projection\" href=\"" ).append( desktopContext.getDesktopThemeRootUrl() ).append( "/css/styles.css\"/>" );
+                hr.addHeaderSectionFragment( "desktop.style.desktoptheme", HeaderResource.HEADER_SECTION_DESKTOP_STYLE_DESKTOPTHEME, desktopThemeStyleLink.toString() );
+            }
+            if ( hr.isHeaderSectionIncluded( HeaderResource.HEADER_SECTION_DESKTOP_INIT ) )
+            {
+                hr.setHeaderSectionType( HeaderResource.HEADER_SECTION_DESKTOP_INIT, HeaderResource.HEADER_TYPE_SCRIPT_BLOCK_START );
+                StringBuffer desktopInitScript = new StringBuffer();
+                desktopInitScript.append( "    function jsDesktopInit() {" );
+                desktopInitScript.append( INIT_FUNCTION_NAME ).append( "(\"" );
+                desktopInitScript.append( desktopContext.getDesktopTheme() );
+                desktopInitScript.append( "\", \"");
+                desktopInitScript.append( desktopContext.getDesktopThemeRootUrl() );
+                desktopInitScript.append( "\"); }" ).append( EOL );
+                desktopInitScript.append( "    dojo.addOnLoad( window.jsDesktopInit );" );
+                hr.addHeaderSectionFragment( "desktop.init", HeaderResource.HEADER_SECTION_DESKTOP_INIT, desktopInitScript.toString() );
+            }
+            
+            dispatcher.include( request.getRequest(), request.getResponse() );
         }
         catch (Exception e)
         {
@@ -120,7 +160,7 @@
     }
 
     
-    public void setDefaultTheme(String defaultTheme)
+    protected void setDefaultTheme(String defaultTheme)
     {
         this.defaultTheme = defaultTheme;
     }
@@ -225,5 +265,9 @@
         this.servletContext = servletContext;
     }
     
+    public HeaderResourceFactory getHeaderResourceFactory()
+    {
+        return this.headerResourceFactory;
+    }
 }
     

Modified: portals/jetspeed-2/trunk/jetspeed-api/src/java/org/apache/jetspeed/PortalReservedParameters.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/jetspeed-api/src/java/org/apache/jetspeed/PortalReservedParameters.java?view=diff&rev=469307&r1=469306&r2=469307
==============================================================================
--- portals/jetspeed-2/trunk/jetspeed-api/src/java/org/apache/jetspeed/PortalReservedParameters.java (original)
+++ portals/jetspeed-2/trunk/jetspeed-api/src/java/org/apache/jetspeed/PortalReservedParameters.java Mon Oct 30 14:35:55 2006
@@ -48,6 +48,10 @@
     public static final String CONTENT_DISPATCHER_ATTRIBUTE = "org.apache.jetspeed.ContentDispatcher";
     public static final String OVERRIDE_PORTLET_TITLE_ATTR = "org.apache.jetspeed.portlet.title";
     public static final String HEADER_RESOURCE_ATTRIBUTE = "org.apache.jetspeed.headerresource";
+    public static final String HEADER_CONFIGURATION_ATTRIBUTE = "org.apache.jetspeed.headerconfiguration";
+    public static final String HEADER_NAMED_RESOURCE_ATTRIBUTE = "org.apache.jetspeed.headernamedresource";
+    public static final String HEADER_NAMED_RESOURCE_ADDED_FRAGMENTS_ATTRIBUTE = "org.apache.jetspeed.headernamedresourceaddedfragments";
+    public static final String HEADER_NAMED_RESOURCE_REGISTRY_ATTRIBUTE = "org.apache.jetspeed.headernamedresourceregistry";
     public static final String PATH_ATTRIBUTE = "org.apache.jetspeed.Path";
     public static final String PARAMETER_ALREADY_DECODED_ATTRIBUTE = "org.apache.jetspeed.parameterAlreadyDecoded";
     public static final String RESOVLER_CACHE_ATTR = "org.apache.jetspeed.resovler.cache";

Modified: portals/jetspeed-2/trunk/jetspeed-api/src/java/org/apache/jetspeed/desktop/JetspeedDesktop.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/jetspeed-api/src/java/org/apache/jetspeed/desktop/JetspeedDesktop.java?view=diff&rev=469307&r1=469306&r2=469307
==============================================================================
--- portals/jetspeed-2/trunk/jetspeed-api/src/java/org/apache/jetspeed/desktop/JetspeedDesktop.java (original)
+++ portals/jetspeed-2/trunk/jetspeed-api/src/java/org/apache/jetspeed/desktop/JetspeedDesktop.java Mon Oct 30 14:35:55 2006
@@ -15,6 +15,7 @@
  */
 package org.apache.jetspeed.desktop;
 
+import org.apache.jetspeed.headerresource.HeaderResourceFactory;
 import org.apache.jetspeed.request.RequestContext;
 
 /**
@@ -40,5 +41,12 @@
      * @return default theme for portal
      */
     String getDefaultTheme();
+    
+    /**
+     * Retrieve the header resource factory
+     * 
+     * @return header resource factory
+     */
+    HeaderResourceFactory getHeaderResourceFactory();
             
 }

Modified: portals/jetspeed-2/trunk/jetspeed-api/src/java/org/apache/jetspeed/desktop/JetspeedDesktopContext.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/jetspeed-api/src/java/org/apache/jetspeed/desktop/JetspeedDesktopContext.java?view=diff&rev=469307&r1=469306&r2=469307
==============================================================================
--- portals/jetspeed-2/trunk/jetspeed-api/src/java/org/apache/jetspeed/desktop/JetspeedDesktopContext.java (original)
+++ portals/jetspeed-2/trunk/jetspeed-api/src/java/org/apache/jetspeed/desktop/JetspeedDesktopContext.java Mon Oct 30 14:35:55 2006
@@ -18,6 +18,8 @@
 import java.util.Locale;
 import java.util.ResourceBundle;
 
+import org.apache.jetspeed.headerresource.HeaderResource;
+
 /**
  * Jetspeed Desktop 
  *
@@ -31,21 +33,60 @@
     String RESOURCES_DIRECTORY_NAME = "resources";
     
     /**
-     * Get an absolute portal from a relative URL.
-     * This request adds in the servlet path such as "/desktop"
+     * Portal base url ( e.g. http://localhost:8080/jetspeed )
      * 
-     * @param relativePath
-     * @return The full portal URL from a relative path
-     */     
-    String getPortalUrl(String relativePath);
+     * @return portal base url
+     */
+    public String getPortalBaseUrl();
     
     /**
-     * Gets an absolute resource URL to a portal resource, minus the servlet path
+     * Portal base url ( e.g. http://localhost:8080/jetspeed )
      * 
-     * @param relativePath
-     * @return
+     * @return portal base url
+     */
+    public String getPortalBaseUrl( boolean encode );
+    
+    /**
+     * Portal base url with relativePath argument appended ( e.g. http://localhost:8080/jetspeed/javascript/dojo/ )
+     * 
+     * @return portal base url with relativePath argument appended
+     */
+    public String getPortalResourceUrl( String relativePath );
+    
+    /**
+     * Portal base url with relativePath argument appended ( e.g. http://localhost:8080/jetspeed/javascript/dojo/ )
+     * 
+     * @return portal base url with relativePath argument appended
+     */
+    public String getPortalResourceUrl( String relativePath, boolean encode );
+    
+    /**
+     * Portal base servlet url ( e.g. http://localhost:8080/jetspeed/desktop/ )
+     * 
+     * @return portal base servlet url
+     */
+    public String getPortalUrl();
+    
+    /**
+     * Portal base servlet url ( e.g. http://localhost:8080/jetspeed/desktop/ )
+     * 
+     * @return portal base servlet url
+     */
+    public String getPortalUrl( boolean encode );
+    
+    /**
+     * Portal base servlet url with relativePath argument appended ( e.g. http://localhost:8080/jetspeed/desktop/default-page.psml )
+     * 
+     * @return portal base servlet url with relativePath argument appended
+     */
+    public String getPortalUrl( String relativePath );
+    
+    /**
+     * Portal base servlet url with relativePath argument appended ( e.g. http://localhost:8080/jetspeed/desktop/default-page.psml )
+     * 
+     * @return portal base servlet url with relativePath argument appended
      */
-    String getPortalResourceUrl(String relativePath);
+    public String getPortalUrl( String relativePath, boolean encode );
 
     /**
      * Gets the desktop-theme name
@@ -55,19 +96,29 @@
     public String getDesktopTheme();
 
     /**
-     * Gets an absolute resource URL to the desktop-theme directory
+     * Gets an absolute resource url to the desktop-theme directory
      * 
      * @return
      */
     public String getDesktopThemeRootUrl();
 
     /**
-     * Gets an absolute resource URL to a desktop-theme resource
+     * Gets an absolute resource url to a desktop-theme resource
      * 
      * @param relativePath
      * @return
      */
-    String getDesktopThemeResourceUrl(String relativePath);
+    public String getDesktopThemeResourceUrl( String relativePath );
+    
+    /**
+     * Gets an relative resource url to a desktop-theme resource
+     * 
+     * @param relativePath
+     * @return
+     */
+    public String getDesktopThemeResource( String relativePath );
     
     public ResourceBundle getResourceBundle(Locale locale);
+    
+    public HeaderResource getHeaderResource();
 }



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