Sun Java System Portal Server 7 Developer's Guide

Chapter 9 Extending the Container Providers

This chapter contains instructions for:

Extending the JSPSingleContainerProvider

In the following example, the CustomSingleContainerProvider getSelectedChannel(HttpServletRequest req) method overrides the JSPSingleContainerProvider.getSelectedChannel() method to return the first channel from the list whose width is full_top.

ProcedureTo Develop the CustomSingleContainerProvider

Steps
  1. Extend the JSPSingleContainerProvider and develop the CustomSingleContainerProvider class file.

    The CustomSingleContainerProvider class overrides the JSPSingleContainerProvider.getSelectedChannel() method as shown below.


    package custom;
    
    import com.sun.portal.providers.containers.jsp.single.JSPSingleContainerProvider;
    import com.sun.portal.providers.ProviderException;
    import com.sun.portal.providers.Provider;
    import com.sun.portal.providers.ProviderWidths;
    import com.sun.portal.providers.context.ContainerProviderContext;
    
    import javax.servlet.http.HttpServletRequest;
    
    import java.util.List;
    
    public class CustomSingleContainerProvider extends JSPSingleContainerProvider {
        public String getSelectedChannel(HttpServletRequest req) throws ProviderException {
            List selectedChannels = getSelectedChannels();
            for (int i=0; i<selectedChannels.size(); i++) {
                String channel = (String)selectedChannels.get(i);
                Provider p = getContainerProviderContext().getProvider(req, getName(), channel);
                if (p.getWidth() == ProviderWidths.WIDTH_FULL_TOP) {
                    return channel;
                }
            }
            return (String)selectedChannels.get(0);
        }
    }
  2. Compile the class and put it in the provider class base directory.

    The default directory for the class file is PortalServer-DataDir/portals/portal-ID/desktop/classes. That is, build the JAR and copy the JAR into the provider class base directory. Or, just copy the class as a file into the provider class base directory. To compile the CustomSingleContainerProvider.java file, enter:


    javac -d PortalServer-DataDir/portals/portal-ID/desktop/classes -classpath PortalServer-base/sdk/desktop/desktopsdk.jar:AccessManager-base/lib/servlet.jar CustomSingleContainerProvider.java
  3. Develop the display profile XML fragments for this provider.

    The display profile fragment for the CustomSingleContainerProvider’s provider is saved in CustomSCProvider.xml file (see below) and the display profile fragment for the CustomSingleContainerProvider’s channel is saved in CustomSCChannel.xml file (see below).

    CustomSCProvider.xml file


    <?xml version="1.0" encoding="utf-8" standalone="no"?>
    <!DOCTYPE DisplayProfile SYSTEM "jar://resources/psdp.dtd">
    
    <Provider name="CustomSingleContainerProvider" class="custom.CustomSingleContainerProvider">
        <Properties>
            <String name="contentPage" value="single.jsp"/>
            <Boolean name="showExceptions" value="false"/>
            <String name="title" value=" Single Container Provider "/>
            <String name="description" value=" DESCRIPTION "/>
            <String name="refreshTime" value="0"/>
            <String name="width" value="thin"/>
            <String name="fontFace1" value="Sans-serif"/>
            <String name="productName" value="Sun Java System Portal Server"/>
            <Boolean name="isEditable" value="true"/>
            <String name="editType" value=""/>
            <String name="editContainerName" value="JSPEditContainer"/>
            <String name="presetThemeChannel" value="JSPPresetThemeChannel"/>
            <String name="customThemeChannel" value="JSPCustomThemeChannel"/>
        </Properties>
    </Provider>

    CustomSCChannel.xml File


    <?xml version="1.0" encoding="utf-8" standalone="no"?>
    <!DOCTYPE DisplayProfile SYSTEM "jar://resources/psdp.dtd">
    
    <Container name="CustomSingleContainer"
    provider="CustomSingleContainerProvider" advanced="false">
        <Properties>
            <String name="title" value="JSP custom single container Channel"/>
            <String name="description" value="This is a test for single
    containers"/>
            <String name="contentPage" value="single.jsp"/>
        </Properties>
        <Available>
            <Reference value="Search"/>
            <Reference value="Bookmark"/>
        </Available>
        <Selected>
            <Reference value="Search"/>
        </Selected>
        <Channels>
        </Channels>
    </Container>
  4. Use the psadmin command to upload the display profile fragments for this provider.

    For the CustomSingleContainerProvider, use the psadmin add-display-profile subcommand to upload the CustomSCProvider.xml file and CustomSCChannel.xml file XML fragments into the display profile. See the Sun Java System Portal Server 7 Command-Line Reference for more information on this subcommand.

  5. Create a new directory for the provider in PortalServer-DataDir/portals/portal-ID/desktop/desktoptype directory. The directory for the provider is typically named after the provider’s channel.

    For the sample CustomSingleContainerProvider, create a directory called CustomSingleContainer in PortalServer-DataDir/portals/portal-ID/desktop/desktoptype directory.

  6. Develop and copy the JSP files for the provider in the newly created directory.

    For the CustomSingleContainerProvider, copy files from PortalServer-DataDir/portals/portal-ID/desktop/default/JSPSingleContainerProvider to the PortalServer-DataDir/portals/portal-ID/desktop/desktoptype/CustomSingleContainer directory.

    1. Modify single.jsp file in the PortalServer-DataDir/portals/portal-ID/desktop/desktoptype/CustomSingleContainer directory as shown here:


      <%-- Copyright 2001 Sun Microsystems, Inc. All rights reserved. PROPRIETARY/CONFIDENTIAL. Use of this product is subject to license terms. --%>
      <%-- single.jsp --%>
      <%@ taglib uri="/tld/desktop.tld" prefix="dt" %>
      <%@ taglib uri="/tld/desktopSingle.tld" prefix="dtsingle" %>
      <%@ page import="custom.CustomSingleContainerProvider" %>
      <%@ page session="false" %>
      <jsp:include page="header.jsp" flush="true"/>
      <dt:obtainContainer container="$JSPProvider">
      <dtsingle:singleContainerProvider>
      <dtsingle:obtainSelectedChannel>
      <img src="<dt:scontent/>/desktop/images/nothing.gif" height="8" width="0" border="0" alt=""><br>
      <% CustomSingleContainerProvider csp = (CustomSingleContainerProvider)pageContext.getAttribute("JSPProvider"); %>
      <img src="<dt:scontent/>/desktop/images/nothing.gif" height="8" width="0" border="0" alt=""><br>
      <% String selected = csp.getSelectedChannel(request); out.println(csp.getContainerProviderContext().getContent(request, response, null, selected)); %>
      </dtsingle:obtainSelectedChannel>
      </dtsingle:singleContainerProvider>
      </dt:obtainContainer>
      <jsp:include page="menubar.jsp" flush="true"/>
      <%@ include file="footer.html" %>
    2. Add a FULL_TOP channel to the container provider before testing the container provider.

      For example, for the CustomSingleContainerProvider, add the Search channel via the Portal Server administration console.

  7. Access the CustomSingleContainerProvider from your browser. To access, log in to the Desktop and type the following URL in your browser:


    http://hostname:port/portal-ID/dt?provider=CustomSingleContainer

Extending the JSPTableContainerProvider

This section includes some sample providers that extend JSPTableContainerProvider and override methods in the JSPTableContainerProvider API.

Example 1: Developing CustomTableContainerProvider

The following is an example of a container provider that selects channels dynamically based on the time of the day.

ProcedureTo Develop the CustomTableContainerProvider

Steps
  1. Extend JSPTableContainerProvider and develop the provider class file.

    For CustomTableContainerProvider, the CustomTableContainerProvider class is implemented by extending the JSPTableContainerProvider class as shown in Example 1: Developing CustomTableContainerProvider.


    package custom;
    
    import com.sun.portal.providers.containers.jsp.table.JSPTableContainerProvider;
    import com.sun.portal.providers.ProviderException;
    
    import java.util.List;
    import java.util.ArrayList;
    import java.util.Calendar;
    
    public class CustomTableContainerProvider extends JSPTableContainerProvider {
        private Calendar rightNow = Calendar.getInstance();
            public List getSelectedChannels() throws ProviderException {
            List selectedChannels = super.getSelectedChannels();
            List<String> newList = new ArrayList<String>();
            if (rightNow.AM_PM == rightNow.AM) {
                List amList = (List)getListProperty("amList");
                for (int i = 0; i < amList.size(); i++) {
                    String channel = (String)amList.get(i);
                    if (selectedChannels.contains(channel)) {
                        newList.add(channel);
                    }
                }
                return newList;
            } else {
                List pmList = (List)getListProperty("pmList");
                for (int i = 0; i < pmList.size(); i++) {
                    String channel = (String)pmList.get(i);
                    if (selectedChannels.contains(channel)) {
                        newList.add(channel);
                    }
                }
                return newList;
            }
        }
    }
  2. Compile the class and put it in the provider class base directory.

    The default directory for the class file is PortalServer-DataDir/portals/portal-ID/desktop/classes. That is, build the JAR and copy the JAR into the provider class base directory. Or, just copy the class as a file into the provider class base directory. To compile the CustomTableContainerProvider.java file, enter:


    javac -d PortalServer-DataDir/portals/portal-ID/desktop/classes -classpath PortalServer-base/sdk/desktop/desktopsdk.jar:AccessManager-base/lib/servlet.jar CustomTableContainerProvider.java
  3. Develop the display profile XML fragments for this provider and this provider’s channel.

    The display profile fragment for the CustomTableContainerProvider’s provider is saved in CustomTCProvider.xml file and the display profile fragment for the CustomTableContainerProvider’s channel is saved in CustomTCChannel.xml file.

    CustomTCProvider.xml File


    <?xml version="1.0" encoding="utf-8" standalone="no"?>
    <!DOCTYPE DisplayProfile SYSTEM "jar://resources/psdp.dtd">
    
    <Provider name="CustomTableContainerProvider" class="custom.CustomTableContainerProvider">
        <Properties>
            <String name="contentPage" value="toptable.jsp"/>
            <Integer name="timeout" value ="1800"/>
            <Integer name="layout" value="1"/>
            <Boolean name="showExceptions" value="false"/>
            <Boolean name="parallelChannelsInit" value="false"/>
            <String name="title" value="Table Container Provider"/>
            <String name="description" value="DESCRIPTION"/>
            <String name="refreshTime" value="0"/>
            <String name="width" value="thin"/>
            <String name="fontFace1" value="Sans-serif"/>
            <String name="Desktop-fontFace1" value="Sans-serif"/>
            <String name="productName" value="Sun Java System Portal Server"/>
            <String name="presetThemeChannel" value="JSPPresetThemeContainer"/>
            <String name="customThemeChannel" value="JSPCustomThemeContainer"/>
            <Boolean name="refreshParentContainerOnly" value="false" advanced="true"/>
            <Boolean name="isEditable" value="true"/>
            <String name="editType" value="edit_complete"/>
            <String name="editContainerName" value="JSPEditContainer"/>
            <Integer name="thin_popup_height" value="200"/>
            <Integer name="thin_popup_width" value="500"/>
            <Integer name="thick_popup_height" value="300"/>
            <Integer name="thick_popup_width" value="600"/>
            <Integer name="fullwidth_popup_height" value="500"/>
            <Integer name="fullwidth_popup_width" value="600"/>
            <Collection name="categories">
                <String value="Personal Channels"/>
                <String value="Sample Channels"/>
                <String value="News Channels"/>
                <String value="Search Channels"/>
            </Collection>
            <Collection name="Personal Channels">
                <String value="UserInfo"/>
                <String value="MailCheck"/>
                <String value="Bookmark"/>
                <String value="App"/>
            </Collection>
            <Collection name="Sample Channels">
                <String value="SampleSimpleWebService"/>
                <String value="SampleJSP"/>
                <String value="SampleXML"/>
                <String value="SampleURLScraper"/>
            </Collection>
            <Collection name="News Channels">
                <String value="SampleRSS"/>
                <String value="Postit"/>
            </Collection>
            <Collection name="Search Channels">
                <String value="Search"/>
            </Collection>
            <Boolean name="defaultChannelIsMinimizable" value="true"/>
            <Boolean name="defaultChannelIsMinimized" value="false" advanced="true"/>
            <Boolean name="defaultChannelIsDetached" value="false" advanced="true"/>
            <Boolean name="defaultChannelIsDetachable" value="true"/>
            <Boolean name="defaultChannelIsRemovable" value="true"/>
            <Boolean name="defaultChannelHasFrame" value="true" advanced="true"/>
            <Boolean name="defaultChannelIsMovable" value="true"/>
            <Boolean name="defaultBorderlessChannel" value="false" advanced="true"/>
            <String name="defaultChannelColumn" value="1" advanced="true"/>
            <String name="defaultChannelRow" value="1" advanced="true"/>
            <Collection name="channelsIsMinimized" advanced="true"/>
            <Collection name="channelsIsDetached" advanced="true"/>
            <Collection name="channelsHasFrame" advanced="true"/>
            <Collection name="channelsIsMinimizable"/>
            <Collection name="channelsRow" advanced="true"/>
            <Collection name="channelsColumn" advanced="true"/>
            <Collection name="channelsIsMovable"/>
            <Collection name="channelsIsDetachable"/>
            <Collection name="channelsIsRemovable"/>
            <Collection name="borderlessChannels"/>
        </Properties>
    </Provider>

    CustomTCChannel.xml File


    <?xml version="1.0" encoding="utf-8" standalone="no"?>
    <!DOCTYPE DisplayProfile SYSTEM "jar://resources/psdp.dtd">
    
    <Container name="CustomTableContainer" provider="CustomTableContainerProvider">
        <Properties>
            <String name="title" value="Front Table Container Channel"/>
            <String name="contentPage" value="toptable.jsp"/>
            <String name="description" value="This is a test for front table containers" />
            <String name="Desktop-fontFace1" value="Sans-serif"/>
            <Collection name="categories">
                <String value="Personal Channels"/>
                <String value="Sample Channels"/>
                <String value="News Channels"/>
            </Collection>
            <Collection name="Personal Channels">
                <String value="UserInfo"/>
                <String value="MailCheck"/>
                <String value="Bookmark"/>
                <String value="App"/>
            </Collection>
            <Collection name="Sample Channels">
                <String value="SampleJSP"/>
                <String value="SampleXML"/>
            </Collection>
            <Collection name="News Channels">
                <String value="SampleRSS"/>
            </Collection>
            <Collection name="channelsRow" advanced="true">
                <String name="MailCheck" value="4"/>
                <String name="App" value="5"/>
                <String name="Bookmark" value="3"/>
                <String name="SampleRSS" value="2"/>
                <String name="SampleXML" value="2"/>
            </Collection>
            <Collection name="channelsIsRemovable" >
                <Boolean name="UserInfo" value="false"/>
            </Collection>
            <Collection name="amList">
                <String value="UserInfo"/>
                <String value="MailCheck"/>
                <String value="App"/>
                <String value="Bookmark"/>
            </Collection>
            <Collection name="pmList">
                <String value="MyFrontPageTabPanelContainer/Bookmark2"/>
                <String value="MailCheck"/>
                <String value="SampleXML"/>
                <String value="SampleRSS"/>
            </Collection>
        </Properties>
        <Available>
            <Reference value="UserInfo"/>
            <Reference value="MailCheck"/>
            <Reference value="App"/>
            <Reference value="Bookmark"/>
            <Reference value="MyFrontPageTabPanelContainer/Bookmark2"/>
            <Reference value="SampleJSP"/>
            <Reference value="SampleRSS"/>
            <Reference value="SampleXML"/>
        </Available>
        <Selected>
            <Reference value="UserInfo"/>
            <Reference value="MailCheck"/>
            <Reference value="App"/>
            <Reference value="Bookmark"/>
            <Reference value="MyFrontPageTabPanelContainer/Bookmark2"/>
            <Reference value="SampleJSP"/>
            <Reference value="SampleRSS"/>
            <Reference value="SampleXML"/>
        </Selected>
        <Channels>
        </Channels>
    </Container>
  4. Use the psadmin command to upload the display profile fragments for this provider.

    For CustomTableContainerProvider, use the psadmin add-display-profile subcommand to upload the CustomTCProvider.xml file and CustomTCChannel.xml file fragments in the display profile. See the Sun Java System Portal Server 7 Command-Line Reference for more information on this subcommand.

  5. Create a new directory for the provider in PortalServer-DataDir/portals/portal—ID/desktop/desktoptype directory. The directory for the provider is typically named after the channel.

    For the sample CustomTableContainerProvider, create a directory called CustomTableContainer in PortalServer-DataDir/portals/portal—ID/desktop/desktoptype directory.

  6. Develop and copy the JSP files for the provider in the newly created directory.

    For CustomTableContainerProvider, copy files from PortalServer-DataDir/portals/portal—ID/desktop/default/JSPTableContainerProvider to the PortalServer-DataDir/portals/portal—ID/desktop/desktoptype/CustomTableContainer directory.

  7. Copy the resource file for the provider into PortalServer-DataDir/portals/portal—ID/desktop/classes directory.

    For example, for the CustomTableContainerProvider:

    1. Change directories to PortalServer-DataDir/portals/portal—ID/desktop/classes directory.

    2. Type cp JSPTableContainerProvider.properties PortalServer-DataDir/portals/portal—ID/desktop/classes/CustomTableContainerProvider.properties.

  8. Access CustomTableContainerProvider from your browser. To access, log in to the Desktop and type the following URL in your browser:


    http://hostname:port/portal-ID/dt?provider=CustomTableContainer

Example 2: Developing SpanTableContainerProvider

The sample SpanTableContainerProvider provides a layout for a Thin_Wide_Thin_Span column. This table Desktop layout has three columns with the full_bottom spanning two (left and center) columns.

ProcedureTo Develop the SpanTableContainerProvider

Steps
  1. Extend JSPTableContainerProvider and develop the SpanTableContainerProvider class file.

    The SpanTableContainerProvider class is implemented by extending the JSPTableContainerProvider class as shown below.

    SpanTableContainerProvider.java File


    package custom;
    
    import com.sun.portal.providers.containers.jsp.table.JSPTableContainerProvider;
    import com.sun.portal.providers.ProviderException;
    import com.sun.portal.providers.ProviderWidths;
    import com.sun.portal.providers.Provider;
    
    import com.sun.portal.providers.context.ContainerProviderContext;
    
    import javax.servlet.http.HttpServletRequest;
    
    import java.util.List;
    
    public class SpanTableContainerProvider extends JSPTableContainerProvider {
        public int getRowSpan(HttpServletRequest req) throws ProviderException {
            int rowSpan = 1;
            List selected = getSelectedChannels();
            for (int i=0; i < selected.size(); i++) {
                String channel = (String)selected.get(i);
                Provider p = getContainerProviderContext().getProvider(req, getName(), channel);
    
                if ( (p.getWidth() == ProviderWidths.WIDTH_FULL_BOTTOM) ) {
                    rowSpan = rowSpan++;
                }
            }
            return rowSpan;
        }
    }
  2. Compile the class and put it in the provider class base directory.

    The default directory for the class file is PortalServer-DataDir/portals/portal-ID/desktop/classes. That is, build the JAR and copy the JAR into the provider class base directory. Or, just copy the class as a file into the provider class base directory. To compile the SpanTableContainerProvider.java file, enter:


    javac -d PortalServer-DataDir/portals/portal-ID/desktop/classes -classpath PortalServer-base/sdk/desktop/desktopsdk.jar:AccessManager-base/lib/servlet.jar SpanTableContainerProvider.java
  3. Develop the display profile XML fragments for this provider and this provider’s channel.

    The display profile fragment for SpanTableContainerProvider’s provider is saved in SpanTCProvider.xml file and the display profile fragment for SpanTableContainerProvider’s channel is saved in SpanTCChannel.xml file.

    SpanTCProvider.xml File


    <?xml version="1.0" encoding="utf-8" standalone="no"?>
    <!DOCTYPE DisplayProfile SYSTEM "jar://resources/psdp.dtd">
    
    <Provider name="SpanTableContainerProvider" class="custom.SpanTableContainerProvider">
        <Properties>
            <String name="contentPage" value="toptable.jsp"/>
            <Integer name="timeout" value ="1800"/>
            <Integer name="layout" value="1"/>
            <Boolean name="showExceptions" value="false"/>
            <Boolean name="parallelChannelsInit" value="false"/>
            <String name="title" value="Table Container Provider"/>
            <String name="description" value="DESCRIPTION"/>
            <String name="refreshTime" value="0"/>
            <String name="width" value="thin"/>
            <String name="fontFace1" value="Sans-serif"/>
            <String name="Desktop-fontFace1" value="Sans-serif"/>
            <String name="productName" value="Sun Java System Portal Server"/>
            <String name="presetThemeChannel" value="JSPPresetThemeContainer"/>
            <String name="customThemeChannel" value="JSPCustomThemeContainer"/>
            <Boolean name="refreshParentContainerOnly" value="false" advanced="true"/>
            <Boolean name="isEditable" value="true"/>
            <String name="editType" value="edit_complete"/>
            <String name="editContainerName" value="JSPEditChannel"/>
            <Integer name="thin_popup_height" value="200"/>
            <Integer name="thin_popup_width" value="500"/>
            <Integer name="thick_popup_height" value="300"/>
            <Integer name="thick_popup_width" value="600"/>
            <Integer name="fullwidth_popup_height" value="500"/>
            <Integer name="fullwidth_popup_width" value="600"/>
            <Collection name="categories">
                <String value="Personal Channels"/>
                <String value="Sample Channels"/>
                <String value="News Channels"/>
                <String value="Search Channels"/>
            </Collection>
            <Collection name="Personal Channels">
                <String value="UserInfo"/>
                <String value="MailCheck"/>
                <String value="Bookmark"/>
                <String value="App"/>
            </Collection>
            <Collection name="Sample Channels">
                <String value="SampleSimpleWebService"/>
                <String value="SampleJSP"/>
                <String value="SampleXML"/>
                <String value="SampleURLScraper"/>
            </Collection>
            <Collection name="News Channels">
                <String value="SampleRSS"/>
                <String value="Postit"/>
            </Collection>
            <Collection name="Search Channels">
                <String value="Search"/>
            </Collection>
            <Boolean name="defaultChannelIsMinimizable" value="true"/>
            <Boolean name="defaultChannelIsMinimized" value="false" advanced="true"/>
            <Boolean name="defaultChannelIsDetached" value="false" advanced="true"/>
            <Boolean name="defaultChannelIsDetachable" value="true"/>
            <Boolean name="defaultChannelIsRemovable" value="true"/>
            <Boolean name="defaultChannelHasFrame" value="true" advanced="true"/>
            <Boolean name="defaultChannelIsMovable" value="true"/>
            <Boolean name="defaultBorderlessChannel" value="false" advanced="true"/>
            <String name="defaultChannelColumn" value="1" advanced="true"/>
            <String name="defaultChannelRow" value="1" advanced="true"/>
            <Collection name="channelsIsMinimized" advanced="true"/>
            <Collection name="channelsIsDetached" advanced="true"/>
            <Collection name="channelsHasFrame" advanced="true"/>
            <Collection name="channelsIsMinimizable"/>
            <Collection name="channelsRow" advanced="true"/>
            <Collection name="channelsColumn" advanced="true"/>
            <Collection name="channelsIsMovable"/>
            <Collection name="channelsIsDetachable"/>
            <Collection name="channelsIsRemovable"/>
            <Collection name="borderlessChannels"/>
        </Properties>
    </Provider>

    SpanTCChannel.xml File


    <?xml version="1.0" encoding="utf-8" standalone="no"?>
    <!DOCTYPE DisplayProfile SYSTEM "jar://resources/psdp.dtd">
    
    <Container name="SpanTableContainerChannel" provider="SpanTableContainerProvider">
        <Properties>
            <String name="title" value="Front Table Container Channel"/>
            <String name="contentPage" value="toptable.jsp"/>
            <String name="description" value="This is a test for spanning table containers" />
            <String name="Desktop-fontFace1" value="Sans-serif"/>
            <Collection name="categories">
                <String value="Personal Channels"/>
                <String value="Sample Channels"/>
                <String value="News Channels"/>
            </Collection>
            <Collection name="Personal Channels">
                <String value="UserInfo"/>
                <String value="MailCheck"/>
                <String value="Bookmark"/>
                <String value="App"/>
            </Collection>
            <Collection name="Sample Channels">
                <String value="SampleJSP"/>
                <String value="SampleXML"/>
            </Collection>
            <Collection name="News Channels">
                <String value="SampleRSS"/>
            </Collection>
            <Collection name="channelsRow" advanced="true">
                <String name="MailCheck" value="4"/>
                <String name="App" value="5"/>
                <String name="Bookmark" value="3"/>
                <String name="SampleRSS" value="2"/>
                <String name="SampleXML" value="2"/>
            </Collection>
            <Collection name="channelsIsRemovable" >
                <Boolean name="UserInfo" value="false"/>
            </Collection>
            <Collection name="amList">
                <String value="UserInfo"/>
                <String value="MailCheck"/>
                <String value="App"/>
                <String value="Bookmark"/>
            </Collection>
            <Collection name="pmList">
                <String value="MyFrontPageTabPanelContainer/Bookmark2"/>
                <String value="MailCheck"/>
                <String value="SampleXML"/>
                <String value="SampleRSS"/>
            </Collection>
        </Properties>
        <Available>
            <Reference value="UserInfo"/>
            <Reference value="MailCheck"/>
            <Reference value="App"/>
            <Reference value="Bookmark"/>
            <Reference value="MyFrontPageTabPanelContainer/Bookmark2"/>
            <Reference value="SampleJSP"/>
            <Reference value="SampleRSS"/>
            <Reference value="SampleXML"/>
        </Available>
        <Selected>
            <Reference value="UserInfo"/>
            <Reference value="MailCheck"/>
            <Reference value="App"/>
            <Reference value="Bookmark"/>
            <Reference value="MyFrontPageTabPanelContainer/Bookmark2"/>
            <Reference value="SampleJSP"/>
            <Reference value="SampleRSS"/>
            <Reference value="SampleXML"/>
        </Selected>
        <Channels>
        </Channels>
    </Container>
  4. Use the psadmin command to upload the display profile fragments for this provider.

    For SpanTableContainerProvider, use the psadmin add-display-profile subcommand to upload the CustomTCProvider.xml file and CustomTCChannel.xml file fragments in the display profile. See the Sun Java System Portal Server 7 Command-Line Reference for more information on this subcommand.

  5. Create a new directory for the provider in PortalServer-DataDir/portals/portal-ID/desktop/desktoptype directory. The directory for the provider is typically named after the channel.

    For the sample SpanTableContainerProvider, create a directory called SpanTableContainerChannel in PortalServer-DataDir/portals/portal-ID/desktop/desktoptype directory.

  6. Copy files from PortalServer-DataDir/portals/portal-ID/desktop/default/JSPTableContainerProvider to the newly created directory.

  7. Modify the JSP files (in PortalServer-DataDir/portals/portal-ID/desktop/desktoptype/SpanTableContainerChannel) as shown in Step a, Step b, and Step c (modifications to the file are shown in bold):

    1. Add the following to toptable.jsp file:


      <!-- BEGIN FULL TOP CHANNELS -->
      <dttable:getColumns id="channels" column="top" scope="request"/>
      <jsp:include page="tabletopbottom.jsp" flush="true">
      <jsp:param name="columnName" value="top"/>
      </jsp:include>
      <!-- END TOP CHANNELS -->
      <!-- BEGIN FULL BOTTOM CHANNELS -->
      <dttable:getColumns id="channels" column="bottom" scope="request"/>
      <jsp:include page="tabletopbottom.jsp" flush="true">
      <jsp:param name="columnName" value="bottom"/>
      </jsp:include>
      <!-- END BOTTOM CHANNELS -->

      Here, tcp is an instance of SpanTableContainerProvider.

    2. Add the following to tablecolumn.jsp file:


      <%@ page import="custom.SpanTableContainerProvider"%>
      <%@ page session="false" %>
      <% SpanTableContainerProvider tcp = (SpanTableContainerProvider)pageContext.getAttribute("JSPProvider"); %>
      <dt:obtainContainer container="$JSPProvider">
      <% String columnName = request.getParameter( "columnName" ); %>
      <% pageContext.setAttribute( "columnName", columnName ); %>
      <% if (columnName.equalsIgnoreCase("right")) { %>
      <TD WIDTH="<dttable:getColumnWidth column="$columnName"/>%" VALIGN=TOP ROWSPAN="<%=tcp.getRowSpan(request)%>"> <% } else { %>
      <TD WIDTH="<dttable:getColumnWidth column="$columnName"/>%" VALIGN=TOP>
      <% } %>
      
    3. Add the following to tabletopbottom.jsp file:


      <jx:if test="$hasChannel">
      <TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=0>
      <% if (request.getParameter("columnName").equals("bottom")) { %>
      <TR COLSPAN=2>
      <% } else { %>
      <TR>
      <% } %>
      <TD WIDTH="100%" VALIGN=TOP>
      <jx:forEach var="channel" items="$channels">
  8. Copy the PortalServer-DataDir/portals/portal-ID/desktop/classes/JSPTableContainerProvider.properties to PortalServer-DataDir/portals/portal-ID/desktop/classes/SpanTableContainerProvider.properties file.

  9. At least one of the selected channels should be of width full_bottom and the selected layout should be thin_wide_thin for the sample layout to be displayed.

  10. Access SpanTableContainerProvider from your browser. To access, type the following URL in your browser:


    http://hostname:port/portal-ID/dt?provider=SpanTableContainerChannel

Customizing the Row Layout

This section provides some sample extensions to the JSPTableContainerProvider class file and its associated JSP files for enabling a customized Desktop layout.

ProcedureTo Develop the CustomTCProvider

Steps
  1. Create a new custom table container provider by extending JSPTableContainerProvider.

    Override the getLayout(), setUpColumns(), and getWidths() methods as shown in the CustomTCProvider.java file. You can also add any new logic to arrange the channels into rows and columns according to your new layout.

    CustomTCProvider.java File


    package custom;
    
    import com.sun.portal.providers.containers.jsp.table.JSPTableContainerProvider;
    import com.sun.portal.providers.ProviderException;
    import com.sun.portal.providers.ProviderWidths;
    import com.sun.portal.providers.Provider;
    import com.sun.portal.providers.util.Layout;
    
    import com.sun.portal.providers.context.ContainerProviderContext;
    
    import javax.servlet.http.HttpServletRequest;
    
    import java.util.List;
    import java.util.ArrayList;
    import java.util.Map;
    import java.util.HashMap;
    import java.util.Iterator;
    
    public class CustomTCProvider extends JSPTableContainerProvider {
        public int getLayout() throws ProviderException {
            int layout = getIntegerProperty("layout");
            return layout;
        }
    
        public Map setupColumns(HttpServletRequest req) throws ProviderException {
            int layout = getLayout();
            List leftList = new ArrayList();
            List centerList = new ArrayList();
            List rightList = new ArrayList();
            List fullTopList = new ArrayList();
            List fullBottomList = new ArrayList();
            if ((layout >= Layout.LAYOUT_THIN_THICK) && (layout <= Layout.LAYOUT_THIN_THIN_THIN)) {
                return super.setupColumns(req);
            } else {
                List selectedChannels = getSelectedChannels();
                for (Iterator i = selectedChannels.iterator(); i.hasNext(); ) {
                    String providerName = (String)i.next();
                    Provider p = null;
                    p = getContainerProviderContext().getProvider(req,
    getName(), providerName);
                    int width = -1;
                    try {
                        width = p.getWidth();
                    }
                      catch (NumberFormatException e) {
                    }
                      catch (Throwable e) {
                    }
                }
                // add the channel to leftList/centerList/rightList/fullTopList/fullBottomList based on width and as required by your new layout.
            }
            Map<Integer,List> columnMap = new HashMap<Integer,List>();
    
            columnMap.put( new Integer(LEFT), leftList );
            columnMap.put( new Integer(RIGHT), rightList );
            columnMap.put( new Integer(CENTER), centerList );
            columnMap.put( new Integer(TOP), fullTopList );
            columnMap.put( new Integer(BOTTOM), fullBottomList );
            return columnMap;
        }
        public int getWidths(int column) throws ProviderException {
            int centerWidth = -1;
            int leftWidth = -1;
            int rightWidth = -1;
            /* modify this method as shown in the customizing column widths
    section according to your layout specifications or keep this method as is.*/
            //return the corresponding width based on the column.
            switch( column ) {
                case LEFT:
                return leftWidth;
                case RIGHT:
                return rightWidth;
                case CENTER:
                return centerWidth;
                default:
                return -1;
            }
        }
    }
  2. Compile the class and put it in the provider class base directory.

    The default directory for the class file is PortalServer-DataDir/portals/portal-ID/desktop/classes/. That is, build the JAR and copy the JAR into the provider class base directory. Or, just copy the class as a file into the provider class base directory. To compile the CustomTCProvider.java file, enter:


    javac -d PortalServer-DataDir/portals/portal-ID/desktop/classes/ -classpath PortalServer-base/sdk/desktop/desktopsdk.jar:AccessManager-base/lib/servlet.jar CustomTCProvider.java
  3. Develop the display profile XML fragment for this provider and this provider’s channel and use the psadmin command to upload the display profile fragments for this provider.

    1. The display profile fragment for the CustomTCProvider’s provider and channel must be saved in separate XML files.

    2. Add <Integer name="layout" value="5"/> in the display profile fragment for the CustomTCProvider’s provider.

    3. Use the psadmin add-display-profile subcommand to upload the CustomTCProvider.xml file and CustomTCChannel.xml file fragments in the display profile.

      See the Sun Java System Portal Server 7 Command-Line Reference for more information on this subcommand.

  4. Create a new directory for the provider in PortalServer-DataDir/portals/portal-ID/desktop/desktoptype directory and copy files from PortalServer-DataDir/portals/portal-ID/desktop/default/JSPTableContainerProvider to the newly created directory.

    The directory for the provider is typically named after the provider. For the sample CustomTCProvider, create a directory called CustomTCProvider in PortalServer-DataDir/portals/portal-ID/desktop/desktoptype directory.

  5. Modify the HTML in toptable.jsp file in PortalServer-DataDir/portals/portal-ID/desktop/desktoptype/CustomTCProvider.

    Rearrange the channels into rows and columns as per your specifications. Replace JSPLayoutContainer with CustomLayoutContainer.

  6. Create a new directory for CustomLayoutContainer under PortalServer-DataDir/portals/portal-ID/desktop/desktoptype directory and copy files from PortalServer-DataDir/portals/portal-ID/desktop/default/JSPLayoutContainer to PortalServer-DataDir/portals/portal-ID/desktop/desktoptype/CustomLayoutContainer directory.

    For example, type:


    mkdir PortalServer-DataDir/portals/portal-ID/desktop/desktoptype/CustomLayoutContainer
    cp PortalServer-DataDir/portals/portal-ID/desktop/default/JSPLayoutContainer/* PortalServer-DataDir/portals/portal-ID/desktop/desktoptype/CustomLayoutContainer
  7. Modify layoutedit.jsp to display your new layout in the layout page.

    Modify the layoutedit.jsp file at PortalServer-DataDir/portals/portal-ID/desktop/desktoptype/CustomLayoutContainer.

    layoutedit.jsp File


    <jx:choose>
        <jx:when test="$layout == 1">
            <%@ include file="layout1.jsp" %>
        </jx:when>
        <jx:when test="$layout == 2">
            <%@ include file="layout2.jsp" %>
        </jx:when>
        <jx:when test="$layout == 3">
            <%@ include file="layout3.jsp" %>
        </jx:when>
        <jx:when test="$layout == 5">
            <%@ include file="layout5.jsp" %>
        </jx:when>
    </jx:choose>
  8. Create a new layout5.jsp which gets displayed on the layout page when the user selects layout 5 and modify layoutdoedit.jsp to handle the processing of layout 5 that you have created.

  9. Add the display profile for CustomLayoutContainer as shown in CustomLayoutContainer.xml file and upload the display profile XML fragment for CustomLayoutContainer using the psadmin command.

    CustomLayoutContainer.xml File


    <Container name="CustomLayoutContainer" provider="JSPSingleContainerProvider" advanced="true">
        <Properties>
            <String name="title" value="JSP Custom Layout Channel"/>
            <String name="description" value="This is the JSP Layout Channel"/>
            <String name="contentPage" value="" merge="replace" lock="false" propagate="false"/>
            <String name="editPage" value="layoutedit.jsp"/>
            <String name="processPage" value="layoutdoedit.jsp"/>
            <Boolean name="isEditable" value="true" advanced="true"/>
            <String name="editType" value="edit_complete" advanced="true"/>
        </Properties>
    
        <Available>
        </Available>
        <Selected>
        </Selected>
        <Channels>
        </Channels>
    </Container>

    To upload CustomLayoutContainer.xml file fragments, use the psadmin add-display-profile subcommand. See the Sun Java System Portal Server 7 Command-Line Reference for more information on this subcommand.

  10. Access CustomTCProvider from your browser. To access, type the following URL in your browser:


    http://hostname:port/portal-ID/dt?provider=CustomTCProvider

Customizing the Column Widths

The getWidths(int column) method throws ProviderException; it returns the column width for the column the width is requested for. By default, the column widths for left, right columns in layout 1 and layout 2 are defined as 30, 70 and for layout 3 they are defined as 25, 50, 25.

To customize the column widths, extend the JSPTableContainerProvider and override the getWidths(int column) method to return different widths.

ProcedureTo Develop the CustomJSPTableContainerProvider

Steps
  1. Extend the JSPTableContainerProvider and develop the CustomJSPTableContainerProvider class file.

    The CustomJSPTableContainerProvider class file in CustomJSPTableContainerProvider.java file overrides the getWidths() method in the JSPTableContainerProvider and returns 40 for left, and 60 for right columns, and 30, 40, 30 for layout 3 (changes are shown in bold).

    CustomJSPTableContainerProvider.java File


    package custom;
    
    import com.sun.portal.providers.containers.jsp.table.JSPTableContainerProvider;
    import com.sun.portal.providers.ProviderException;
    import com.sun.portal.providers.ProviderWidths;
    import com.sun.portal.providers.Provider;
    import com.sun.portal.providers.util.Layout;
    
    public class CustomJSPTableContainerProvider extends JSPTableContainerProvider {
        public int getWidths(int column) throws ProviderException {
            int centerWidth = -1;
            int rightWidth = -1;
            int leftWidth = -1;
            int layout = getLayout();
            switch (layout) {
                case Layout.LAYOUT_THIN_THICK:
                    leftWidth = 40;
                    rightWidth = 60;
                    break;
                case Layout.LAYOUT_THICK_THIN:
                    rightWidth = 40;
                    leftWidth = 60;
                    break;
                case Layout.LAYOUT_THIN_THICK_THIN:
                    rightWidth = 30;
                    centerWidth= 40;
                    leftWidth = 30;
                    break;
                default:
                    rightWidth = 40;
                    leftWidth = 60;
                    break;
            }
            switch( column ) {
                case LEFT:
                    return leftWidth;
                case RIGHT:
                    return rightWidth;
                case CENTER:
                    return centerWidth;
                default:
                    return -1;
            }
        }
    }
  2. Compile the class and put it in the provider class base directory.

    The default directory for the class file is PortalServer-DataDir/portals/portal-ID/desktop/classes/. That is, build the JAR and copy the JAR into the provider class base directory. Or, just copy the class as a file into the provider class base directory. To compile the CustomJSPTableContainerProvider.java file, enter:


    javac -d PortalServer-DataDir/portals/portal-ID/desktop/classes/ -classpath BaseDir/SUNWps/sdk/desktop/desktopsdk.jar:BaseDir/SUNWam/lib/servlet.jar CustomJSPTableContainerProvider.java
  3. Develop the display profile XML fragments for this provider and this provider’s channel.

    The display profile fragment for the CustomJSPTableContainerProvider’s provider is saved in CustomJSPTCProvider.xml file and the display profile fragment for the CustomTableContainerProvider’s channel is saved in CustomJSPTCChannel.xml file.

    CustomJSPTCProvider.xml File


    <?xml version="1.0" encoding="utf-8" standalone="no"?>
    <!DOCTYPE DisplayProfile SYSTEM "jar://resources/psdp.dtd">
    
    <Provider name="CustomJSPTableContainerProvider" class="custom.CustomJSPTableContainerProvider">
        <Properties>
            <String name="contentPage" value="toptable.jsp"/>
            <Integer name="timeout" value ="1800"/>
            <Integer name="layout" value="1"/>
            <Boolean name="showExceptions" value="false"/>
            <Boolean name="parallelChannelsInit" value="false"/>
            <String name="title" value="Table Container Provider"/>
            <String name="description" value="DESCRIPTION"/>
            <String name="refreshTime" value="0"/>
            <String name="width" value="thin"/>
            <String name="fontFace1" value="Sans-serif"/>
            <String name="Desktop-fontFace1" value="Sans-serif"/>
            <String name="productName" value="Sun Java System Portal Server"/>
            <String name="presetThemeChannel" value="JSPPresetThemeContainer"/>
            <String name="customThemeChannel" value="JSPCustomThemeContainer"/>
            <Boolean name="refreshParentContainerOnly" value="false" advanced="true"/>
            <Boolean name="isEditable" value="true"/>
            <String name="editType" value="edit_complete"/>
            <String name="editContainerName" value="JSPEditChannel"/>
            <Integer name="thin_popup_height" value="200"/>
            <Integer name="thin_popup_width" value="500"/>
            <Integer name="thick_popup_height" value="300"/>
            <Integer name="thick_popup_width" value="600"/>
            <Integer name="fullwidth_popup_height" value="500"/>
            <Integer name="fullwidth_popup_width" value="600"/>
            <Collection name="categories">
                <String value="Personal Channels"/>
                <String value="Sample Channels"/>
                <String value="News Channels"/>
                <String value="Search Channels"/>
            </Collection>
            <Collection name="Personal Channels">
                <String value="UserInfo"/>
                <String value="MailCheck"/>
                <String value="Bookmark"/>
                <String value="App"/>
            </Collection>
            <Collection name="Sample Channels">
                <String value="SampleSimpleWebService"/>
                <String value="SampleJSP"/>
                <String value="SampleXML"/>
                <String value="SampleURLScraper"/>
            </Collection>
            <Collection name="News Channels">
                <String value="SampleRSS"/>
                <String value="Postit"/>
            </Collection>
            <Collection name="Search Channels">
                <String value="Search"/>
            </Collection>
            <Boolean name="defaultChannelIsMinimizable" value="true"/>
            <Boolean name="defaultChannelIsMinimized" value="false" advanced="true"/>
            <Boolean name="defaultChannelIsDetached" value="false" advanced="true"/>
            <Boolean name="defaultChannelIsDetachable" value="true"/>
            <Boolean name="defaultChannelIsRemovable" value="true"/>
            <Boolean name="defaultChannelHasFrame" value="true" advanced="true"/>
            <Boolean name="defaultChannelIsMovable" value="true"/>
            <Boolean name="defaultBorderlessChannel" value="false" advanced="true"/>
            <String name="defaultChannelColumn" value="1" advanced="true"/>
            <String name="defaultChannelRow" value="1" advanced="true"/>
            <Collection name="channelsIsMinimized" advanced="true"/>
            <Collection name="channelsIsDetached" advanced="true"/>
            <Collection name="channelsHasFrame" advanced="true"/>
            <Collection name="channelsIsMinimizable"/>
            <Collection name="channelsRow" advanced="true"/>
            <Collection name="channelsColumn" advanced="true"/>
            <Collection name="channelsIsMovable"/>
            <Collection name="channelsIsDetachable"/>
            <Collection name="channelsIsRemovable"/>
            <Collection name="borderlessChannels"/>
        </Properties>
    </Provider>

    CustomJSPTCChannel.xml File


    <?xml version="1.0" encoding="utf-8" standalone="no"?>
    <!DOCTYPE DisplayProfile SYSTEM "jar://resources/psdp.dtd">
    
    <Container name="CustomJSPTableContainerChannel" provider="CustomJSPTableContainerProvider">
        <Properties>
            <String name="title" value="Front Table Container Channel"/>
            <String name="contentPage" value="toptable.jsp"/>
            <String name="description" value="This is a test for front table containers" />
            <String name="Desktop-fontFace1" value="Sans-serif"/>
            <Collection name="categories">
                <String value="Personal Channels"/>
                <String value="Sample Channels"/>
                <String value="News Channels"/>
            </Collection>
            <Collection name="Personal Channels">
                <String value="UserInfo"/>
                <String value="MailCheck"/>
                <String value="Bookmark"/>
                <String value="App"/>
            </Collection>
            <Collection name="Sample Channels">
                <String value="SampleJSP"/>
                <String value="SampleXML"/>
            </Collection>
            <Collection name="News Channels">
                <String value="SampleRSS"/>
            </Collection>
            <Collection name="channelsRow" advanced="true">
                <String name="MailCheck" value="4"/>
                <String name="App" value="5"/>
                <String name="Bookmark" value="3"/>
                <String name="SampleRSS" value="2"/>
                <String name="SampleXML" value="2"/>
            </Collection>
            <Collection name="channelsIsRemovable" >
                <Boolean name="UserInfo" value="false"/>
            </Collection>
            <Collection name="amList">
                <String value="UserInfo"/>
                <String value="MailCheck"/>
                <String value="App"/>
                <String value="Bookmark"/>
            </Collection>
            <Collection name="pmList">
                <String value="MyFrontPageTabPanelContainer/Bookmark2"/>
                <String value="MailCheck"/>
                <String value="SampleXML"/>
                <String value="SampleRSS"/>
            </Collection>
        </Properties>
        <Available>
            <Reference value="UserInfo"/>
            <Reference value="MailCheck"/>
            <Reference value="App"/>
            <Reference value="Bookmark"/>
            <Reference value="MyFrontPageTabPanelContainer/Bookmark2"/>
            <Reference value="SampleJSP"/>
            <Reference value="SampleRSS"/>
            <Reference value="SampleXML"/>
        </Available>
        <Selected>
            <Reference value="UserInfo"/>
            <Reference value="MailCheck"/>
            <Reference value="App"/>
            <Reference value="Bookmark"/>
            <Reference value="MyFrontPageTabPanelContainer/Bookmark2"/>
            <Reference value="SampleJSP"/>
            <Reference value="SampleRSS"/>
            <Reference value="SampleXML"/>
        </Selected>
        <Channels>
        </Channels>
    </Container>
  4. Use the psadmin command to upload the display profile fragments for this provider.

    For CustomJSPTableContainerProvider, use the psadmin add-display-profile subcommand to upload the CustomTCProvider.xml file and CustomTCChannel.xml file fragments in the display profile. See the Sun Java System Portal Server 7 Command-Line Reference for more information on this subcommand.

  5. Create a new directory for the provider in PortalServer-DataDir/portals/portal-ID/desktop/desktoptype directory. The directory for the provider is typically named after the provider.

    For the sample CustomJSPTableContainerProvider, create a directory called CustomJSPTableContainerChannel in PortalServer-DataDir/portals/portal-ID/desktop/desktoptype directory.

  6. Develop and copy the JSP files for the provider in the newly created directory.

    For CustomJSPTableContainerProvider, copy files from PortalServer-DataDir/portals/portal-ID/desktop/default/JSPTableContainerProvider to the PortalServer-DataDir/portals/portal-ID/desktop/desktoptype/CustomJSPTableContainerChannel directory.

  7. Copy the resource file for the provider into PortalServer-DataDir/portals/portal-ID/desktop/classes directory.

    For example, for the CustomJSPTableContainerProvider:

    1. Change directories to PortalServer-DataDir/portals/portal-ID/desktop/classes directory.

    2. Type cp JSPTableContainerProvider.properties PortalServer-DataDir/portals/portal-ID/desktop/classes/CustomJSPTableContainerProvider.properties.

  8. Access CustomJSPTableContainerProvider from your browser. To access, log in to the desktop and type the following URL in your browser:


    http://hostname:port/portal-ID/dt?provider=CustomJSPTableContainerChannel

Extending the JSPTabContainerProvider

This section includes a sample extension to the JSPTabContainerProvider class. In this example, a new method called getTabTopics() is added to the JSPTabContainerProvider. The getTabTopics() method returns only the predefined tabs from the list of available tabs. This method is then called from the makeNewTab.jsp so that the Make New Tab page of the customTabContainer will only display the Predefined tab topics instead of displaying all the available tabs (predefined and user created).

ProcedureTo Develop the CustomTabContainerProvider

Steps
  1. Extend the JSPTabContainerProvider and develop the CustomTabContainerProvider class file.

    The CustomTabContainerProvider class file includes a getTabTopics() method that returns only the predefined tabs from the list of available tabs.

    CustomTabContainerProvider.java File


    package custom;
    
    import com.sun.portal.providers.containers.jsp.tab.JSPTabContainerProvider;
    import com.sun.portal.providers.containers.jsp.tab.UnmodifiableTab;
    import com.sun.portal.providers.ProviderException;
    
    import java.util.List;
    import java.util.ArrayList;
    
    public class CustomTabContainerProvider extends JSPTabContainerProvider {
        public List getTabTopics() throws ProviderException {
            List<UnmodifiableTab> availtabs = new ArrayList<UnmodifiableTab>();
            List tabs = super.getAvailableTabs();
            for (int i=0; i < tabs.size(); i++) {
                UnmodifiableTab tab = (UnmodifiableTab)tabs.get(i);
                if (tab.isPredefined()) {
                    availtabs.add(tab);
                }
            }
            return availtabs;
        }
    }
  2. Compile the class and put it in the provider class base directory.

    The default directory for the class file is PortalServer-DataDir/portals/portal-ID/desktop/classes. That is, build the JAR and copy the JAR into the provider class base directory. Or, just copy the class as a file into the provider class base directory. To compile the CustomTabContainerProvider.java file, enter:


    javac -d PortalServer-DataDir/portals/portal-ID/desktop/classes -classpath PortalServer-base/sdk/desktop/desktopsdk.jar:AccessManager-base/lib/servlet.jar CustomTabContainerProvider.java
  3. Develop the display profile XML fragments for this provider and this provider’s channel.

    The display profile fragments for the CustomTabContainerProvider’s provider and channel are saved in CustomTabCProvider.xml and CustomTabCChannel.xml files respectively.

    CustomTabCProvider.xml File


    <?xml version="1.0" encoding="utf-8" standalone="no"?>
    <!DOCTYPE DisplayProfile SYSTEM "jar://resources/psdp.dtd">
    
    <Provider name="CustomTabContainerProvider" class="custom.CustomTabContainerProvider">
        <Properties>
            <String name="contentPage" value="tab.jsp"/>
            <Boolean name="showExceptions" value="false"/>
            <String name="title" value="*** Tab Container Provider ***"/>
            <String name="description" value="*** DESCRIPTION ***"/>
            <String name="refreshTime" value="" advanced="true"/>
            <String name="width" value="thin" advanced="true"/>
            <String name="fontFace1" value="Sans-serif"/>
            <String name="productName" value="Sun Java System Portal Server"/>
            <String name="presetThemeChannel" value="JSPPresetThemeContainer" advanced="true"/>
            <String name="customThemeChannel" value="JSPCustomThemeContainer" advanced="true"/>
            <Boolean name="isEditable" value="true" advanced="true"/>
            <String name="editType" value="edit_complete" advanced="true"/>
            <String name="editContainerName" value="JSPEditContainer" advanced="true"/>
    <Integer name="thin_popup_height" value="200"/>
            <Integer name="thin_popup_width" value="500"/>
            <Integer name="thick_popup_height" value="300"/>
            <Integer name="thick_popup_width" value="600"/>
            <Integer name="fullwidth_popup_height" value="500"/>
            <Integer name="fullwidth_popup_width" value="600"/>
            <Boolean name="defaultChannelIsMinimizable" value="true"/>
            <Boolean name="defaultChannelIsMinimized" value="false" advanced="true"/>
            <Boolean name="defaultChannelIsDetached" value="false" advanced="true"/>
            <Boolean name="defaultChannelIsDetachable" value="true"/>
            <Boolean name="defaultChannelIsRemovable" value="true"/>
            <Boolean name="defaultChannelHasFrame" value="true" advanced="true"/>
            <Boolean name="defaultChannelIsMovable" value="true"/>
            <Boolean name="defaultBorderlessChannel" value="false" advanced="true"/>
            <String name="defaultChannelColumn" value="1" advanced="true"/>
            <String name="defaultChannelRow" value="1" advanced="true"/>
            <Collection name="channelsIsMinimized" advanced="true"/>
            <Collection name="channelsIsDetached" advanced="true"/>
            <Collection name="channelsHasFrame" advanced="true"/>
            <Collection name="channelsIsMinimizable"/>
            <Collection name="channelsRow" advanced="true"/>
            <Collection name="channelsColumn" advanced="true"/>
            <Collection name="channelsIsMovable"/>
            <Collection name="channelsIsDetachable"/>
            <Collection name="channelsIsRemovable"/>
            <Collection name="borderlessChannels"/>
        </Properties>
    </Provider>

    CustomTabCChannel.xml File


    <?xml version="1.0" encoding="utf-8" standalone="no"?>
    <!DOCTYPE DisplayProfile SYSTEM "jar://resources/psdp.dtd">
    
    <Container name="CustomTabContainer" provider="CustomTabContainerProvider" merge="replace" lock="false" advanced="false">
        <Properties advanced="false" merge="fuse" lock="false" name="_properties" propagate="true">
            <String name="title" value="JSP Tab Container Channel" advanced="false"
    merge="replace" lock="false" propagate="true"/>
            <String name="description" value="This is a test for tab containers" advanced="false" merge="replace" lock="false" propagate="true"/>
            <String name="contentPage" value="tab.jsp" advanced="false" merge="replace" lock="false" propagate="true"/>
            <String name="editPage" value="tabedit.jsp" advanced="false" merge="replace" lock="false" propagate="true"/>
            <String name="startTab" value="MyFrontPageTabPanelContainer" advanced="false" merge="replace" lock="false" propagate="true"/>
            <Integer name="maxTabs" value="4" advanced="false" merge="replace" lock="false" propagate="true"/>
            <String name="makeTabProvider" value="JSPTabCustomTableContainerProvider" advanced="true" merge="replace" lock="false" propagate="true"/>
            <String name="makeTabChannel" value="JSPTabCustomTableContainer" advanced="true" merge="replace" lock="false" propagate="true"/>
            <Integer name="channelNumber" value="0" advanced="false" merge="replace" lock="false" propagate="true"/>
            <String name="contentChannel" value="JSPContentContainer" advanced="false" merge="replace" lock="false" propagate="true"/>
    
            <Collection name="TabProperties" advanced="false" merge="fuse" lock="false" propagate="true">
                <Collection name="MyFrontPageTabPanelContainer" advanced="false" merge="fuse" lock="false" propagate="true">
                    <String name="title" value="My Front Page" advanced="false" merge="replace" lock="false" propagate="true"/>
                    <String name="desc" value="Your front page" advanced="false" merge="replace" lock="false" propagate="true"/>
                    <Boolean name="removable" value="false" advanced="false" merge="replace" lock="false" propagate="true"/>
                    <Boolean name="renamable" value="true" advanced="false" merge="replace" lock="false" propagate="true"/>
                    <Boolean name="predefined" value="true" advanced="false" merge="replace" lock="false" propagate="true"/>
                </Collection>
    
                <Collection name="SamplesTabPanelContainer" advanced="false" merge="fuse" lock="false" propagate="true">
                    <String name="title" value="Samples" advanced="false" merge="replace" lock="false" propagate="true"/>
                    <String name="desc" value="Sampless Tab" advanced="false" merge="replace" lock="false" propagate="true"/>
                    <Boolean name="removable" value="true" advanced="false" merge="replace" lock="false" propagate="true"/>
                    <Boolean name="renamable" value="true" advanced="false" merge="replace" lock="false" propagate="true"/>
                    <Boolean name="predefined" value="true" advanced="false" merge="replace" lock="false" propagate="true"/>
                </Collection>
    
                <Collection name="JSPTabCustomTableContainer" advanced="false" merge="fuse" lock="false" propagate="true">
                    <String name="title" value="Make My Own Tab" advanced="false" merge="replace" lock="false" propagate="true"/>
                    <String name="desc" value="Make from Scratch" advanced="false" merge="replace" lock="false" propagate="true"/>
                    <Boolean name="removable" value="true" advanced="false" merge="replace" lock="false" propagate="true"/>
                    <Boolean name="renamable" value="true" advanced="false" merge="replace" lock="false" propagate="true"/>
                    <Boolean name="predefined" value="false" advanced="false" merge="replace" lock="false" propagate="true"/>
                </Collection>
    
                <Collection name="SearchTabPanelContainer" advanced="false" merge="fuse" lock="false" propagate="true">
                    <String name="title" value="Search" advanced="false" merge="replace" lock="false" propagate="true"/>
                    <String name="desc" value="Search Tab" advanced="false" merge="replace" lock="false" propagate="true"/>
                    <Boolean name="removable" value="true" advanced="false" merge="replace" lock="false" propagate="true"/>
                    <Boolean name="renamable" value="true" advanced="false" merge="replace" lock="false" propagate="true"/>
                    <Boolean name="predefined" value="true" advanced="false" merge="replace" lock="false" propagate="true"/>
                </Collection>
            </Collection>
        </Properties>
    
        <Available advanced="false" merge="fuse" lock="false">
            <Reference value="MyFrontPageTabPanelContainer" advanced="false" merge="replace" lock="false" propagate="true"/>
            <Reference value="SamplesTabPanelContainer" advanced="false" merge="replace" lock="false" propagate="true"/>
            <Reference value="SearchTabPanelContainer" advanced="false" merge="replace" lock="false" propagate="true"/>
        </Available>
    
        <Selected advanced="false" merge="fuse" lock="false">
            <Reference value="MyFrontPageTabPanelContainer" advanced="false" merge="replace" lock="false" propagate="true"/>
            <Reference value="SamplesTabPanelContainer" advanced="false" merge="replace" lock="false" propagate="true"/>
            <Reference value="SearchTabPanelContainer" advanced="false" merge="replace" lock="false" propagate="true"/>
        </Selected>
    
        <Channels>
        </Channels>
    
    </Container>
  4. Use the psadmin command to upload the display profile fragments for this provider.

    For CustomTabContainerProvider, use the psadmin add-display-profile subcommand to upload the CustomTabCProvider.xml and CustomTabCChannel.xml file fragments in the display profile. See the Sun Java System Portal Server 7 Command-Line Reference for more information on this subcommand.

  5. Create a new directory called CustomTabContainerProvider under PortalServer-DataDir/portals/portal-ID/desktop/desktoptype directory.

  6. Copy all the required JSP files from PortalServer-DataDir/portals/portal-ID/desktop/default/JSPTabContainerProvider to PortalServer-DataDir/portals/portal-ID/desktop/desktoptype/CustomTabContainerProvider directory.

  7. Modify the makeNewTab.jsp file in PortalServer-DataDir/portals/portal-ID/desktop/desktoptype/CustomTabContainerProvider to call getTabTopics().

    That is, replace the makeNewTab.jsp file with the makeNewTab.jsp file shown below.

    makeNewTab.jsp File


    <%--
    Copyright 2001 Sun Microsystems, Inc.  All rights reserved.
    PROPRIETARY/CONFIDENTIAL.  Use of this product is subject to license terms.
    --%>
    <%-- makeNewTab.jsp --%><%@ page import="custom.CustomTabContainerProvider" %>
    <table border=0 cellspacing=2 cellpadding=2 width="50%">
        <tr>
            <td align="right"><font face="<%=fontFace1%>" size="+0"><b>Tab Name:</b></font></td>
            <td><font face="<%=fontFace1%>" size="+0"><input type="text" name="JSPTabContainer.tabName" size="30"></font></td>
        </tr>
        <tr>
            <td align="right"><font face="<%=fontFace1%>" size="+0"><b>Tab Description:</b></font></td>
            <td><font face="<%=fontFace1%>" size="+0"><input type="text" name="JSPTabContainer.tabDesc" size="30"></font></td>
        </tr>
        <tr>
            <td align="right"><font face="<%=fontFace1%>" size="+0"><b>Tab Topics:</b></font></td>
            <td>
                <!-- start tab topic radios -->
                <table border="0" cellpadding="2" cellspacing="2">
                    <%
                        String checked = "";
                    %>
                    <tab:tabContainerProvider>
                    <%
                        CustomTabContainerProvider ctcp = (CustomTabContainerProvider)pageContext.getAttribute("JSPProvider");
                        List tabTopics = ctcp.getTabTopics();
                        for (int i=0; i < tabTopics.size(); i++) {
                            UnmodifiableTab tab = (UnmodifiableTab)tab.get(i);
                    %>
                    <TR>
                        <TD><INPUT TYPE="radio" NAME="JSPTabContainer.tabTopic" VALUE="<%=tab.getEncodedName%>" <%=checked%> ></TD>
                        <TD><FONT SIZE="-1" FACE="sans-serif"> <B> <%=tab.getDisplayname%> </B> <BR> <FONT SIZE="-1" FACE="sans-serif"> <%=tab.getDesc%> </FONT> </FONT> </TD>
                    </TR>
                    <%
                    }
                    %>
                    <%
                    checked = "CHECKED";
                    %>
                    <tab:getMakeTab id="makeTab"/>
                    <tab:obtainTab tab="$makeTab">
                    <%@ include file="makeTopic.jsp" %>
                    </tab:obtainTab>
                    </tab:tabContainerProvider>
                </table>
                <!-- end tab topic radios -->
                <input type="hidden" name="JSPTabContainer.make" value="make">
            </td>
        </tr>
    </table>
  8. Copy the resource file for the provider into PortalServer-DataDir/portals/portal-ID/desktop/classes directory.

    For example, for the CustomJSPTableContainerProvider:

    1. Change directories to PortalServer-DataDir/portals/portal-ID/desktop/classes directory.

    2. Type cp JSPTabContainerProvider.properties PortalServer-DataDir/portals/portal-ID/desktop/classes/CustomTabContainerProvider.properties.

  9. Access CustomTabContainerProvider from your browser. To access, log in to the desktop and type the following URL in your browser:


    http://hostname:port/portal-ID/dt?provider=CustomTabContainer