/* * Copyright (C) 2003-2004 Red Hat Inc. All Rights Reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ package com.arsdigita.portalserver; import com.arsdigita.domain.*; import com.arsdigita.kernel.ACSObjectInstantiator; import com.arsdigita.kernel.Kernel; import com.arsdigita.kernel.KernelExcursion; import com.arsdigita.kernel.ResourceSetup; import com.arsdigita.loader.*; import com.arsdigita.persistence.DataObject; import com.arsdigita.portal.AgentPortlet; import com.arsdigita.portal.PortletSetup; import com.arsdigita.portal.PortletType; import com.arsdigita.portal.apportlet.AppPortletSetup; import com.arsdigita.portalserver.admin.PSAdmin; import com.arsdigita.portalserver.personal.MyPortalsPortlet; import com.arsdigita.portalserver.personal.PersonalPortal; import com.arsdigita.portalserver.personal.PersonalPortalCreator; import com.arsdigita.portalserver.ui.admin.PortalCreator; import com.arsdigita.portalserver.ui.admin.PortalSiteMap; import com.arsdigita.runtime.*; import com.arsdigita.web.Application; import com.arsdigita.web.ApplicationType; // USED BY loadSubsite() which es meant to replace the applications mounted // at root url dispatcher by portalserver dispatcher. Not used anymore, the // page at root address is now determined in a different way. //import com.arsdigita.kernel.PackageType; //import com.arsdigita.kernel.PackageInstance; //import com.arsdigita.kernel.SiteNode; import org.apache.log4j.Logger; /** * Portal Server Loader * * @author Jim Parsons <jparsons@redhat.com> * @version $Revision: #2 $ $Date: 2004/08/17 $ **/ public class Loader extends PackageLoader { /** Logger instance for debugging */ private static final Logger s_log = Logger.getLogger(Loader.class); /** * Run script invoked by com.arsdigita.packing loader script. * * @param ctx */ public void run(final ScriptContext ctx) { new KernelExcursion() { public void excurse() { setEffectiveParty(Kernel.getSystemParty()); loadPortalSiteApplicationType(); buildDefaultThemes(); setupAdminPortal(); loadPortalTabApplicationType(); //formerly ResourceType rtype = setupResource(); loadSubPortalTabApplicationType(); // formerly ResourceType restype = setupSubPortal(); loadPortalSiteAdminApplicationType(); setupPortalSiteAdminInstance(); // formerly from ui.admin.Initializer loadPortalCreatorApplicationType(); loadPortalSitemapApplicationType(); setupPortalCreatorInstance(); setupPortalSitemapInstance(); // formerly from personal.Initializer loadPersonalPortalCreatorApplicationType(); setupPersonalPortalCreatorInstance(); loadPersonalPortalApplicationType(); setupMyPortalsPortlet(); // Loading internal portlets setupAgentPortlet(); setupApplicationDirectoryPortlet(); setupPortalNavigatorPortlet(); setupPortalSummaryPortlet(); // loadSubsite(); } }.run(); s_log.warn("Done"); } // //////////////////////////////////////////////////////////////////////// // // S e t u p o f a p p l i c a t i o n t y p e s // // //////////////////////////////////////////////////////////////////////// /** * Creates a PortalSite, one of the domain classes of the portalserver * package, ApplicationType as a legacy-free type of application type. * * NOTE: The wording in the title parameter of ApplicationType determines * the name of the subdirectory for the XSL stylesheets. * It gets "urlized", i.e. trimming leading and trailing blanks and replacing * blanks between words and illegal characters with an hyphen and converted * to lower case. * Example: "Portal Server" will become "portal-server". * * Creates an entry in table application_types and a corresponding entry in * apm_package_types */ private void loadPortalSiteApplicationType() { /* First try: create a new style, legacy compatible application */ /* ApplicationType type = ApplicationType.createApplicationType( "portalsite", "Portal Site", PortalSite.BASE_DATA_OBJECT_TYPE); // Current code requires an apps specific dispatcher class. Has to be // modified to be able to create a legacy free app type. type.setDispatcherClass ("com.arsdigita.portalserver.ui.PortalDispatcher"); */ // Try: new style legacy free application ApplicationType type = new ApplicationType("Portal Site", // title PortalSite.BASE_DATA_OBJECT_TYPE ); type.setDescription ("A Portal Site is a center for content aggregation. It usually" + "has its own set of applications, such as a discussion forum " + "and content items, as well as a list of participants."); type.save(); } /** * * @return */ private void loadPortalTabApplicationType() { // formerly private void setupResource() in OldInitializer { // legt an in application_types object_type: c.ad.workspace.WorkspaceTab // nichts in applications, // nichts in apm_package_types, ps_*, acs_objects ResourceSetup setup = new ResourceSetup(s_log); setup.setTitle("PortalTab"); setup.setResourceObjectType(PortalTab.BASE_DATA_OBJECT_TYPE); setup.setDescription("A Portal Tab!"); setup.setInstantiator(new ACSObjectInstantiator() { @Override public DomainObject doNewInstance(DataObject dataObject) { return new PortalTab(dataObject); } }); setup.run(); } /** * * @return */ private void loadSubPortalTabApplicationType() { // formerly private void setupSubPortalTab() { in OldInitializer // legt an in application_types object_type: c.ad.workspace.SubWorkspaceTab // ohne Eintrag in package_type_id // nichts in applications, // nichts in apm_package_types, ps_*, acs_objects ResourceSetup setup = new ResourceSetup(s_log); setup.setTitle("SubPortalTab"); setup.setResourceObjectType(SubPortalTab.BASE_DATA_OBJECT_TYPE); setup.setDescription("A SubPortal Tab!"); setup.setInstantiator(new ACSObjectInstantiator() { @Override public DomainObject doNewInstance(DataObject dataObject) { return new SubPortalTab(dataObject); } }); setup.run(); } /* FORMERLY admin.Initializer */ /** * */ // replaced formerly startup() meothod in admin.Initializer private void loadPortalSiteAdminApplicationType() { // erstellt Eintrag in apm_package_types (key portal-admin mit eigenem // dispatcher_class, nciht .... JSPApplicationDispatcher), Eintrag in // apm_packages, in application_tyxpes mit object_type = c.ad.admin.CWAdmin // (statt Klassenname PSAdmin, liegt an Eintrag für BASE_DATA_OBJECT_TYPE), // in applications mit primary_url=/portal-admin/ // in acs_object mit default_domain_class=c.ad.ps.admin.PSAdmin und // object_type=c.ad.admin.CWAdmin, ebenfalls wg. BASE_DATA_OBJ_TYPE /* ApplicationType type = ApplicationType.createApplicationType( "portal-admin", "Portal Server Site Administration", PSAdmin.BASE_DATA_OBJECT_TYPE); // Current code requires an apps specific dispatcher class. Has to be // modified to be able to create a legacy free app type. type.setDispatcherClass ("com.arsdigita.portalserver.admin.ui.Dispatcher"); */ // Try: new style legacy free application ApplicationType type = new ApplicationType("Portal Admin", // title PSAdmin.BASE_DATA_OBJECT_TYPE ); type.setDescription ("Displays common administration tasks."); type.save(); } // FORMERLY ui.admin.Initializer /** * Creates a PortalCreator, another of the domain classes of the portalserver * package, ApplicationType as a legacy-comp type of application type. * */ private void loadPortalCreatorApplicationType() { // formerly private ApplicationType setupPortalCreator() { in ui.admin.Initializer /* ApplicationType type = ApplicationType.createApplicationType( "portal-create", "Portal Creator", PortalCreator.BASE_DATA_OBJECT_TYPE); type.setDescription ("Creates portals."); // Current code requires an apps specific dispatcher class. Has to be // modified to be able to create a legacy free app type. type.setDispatcherClass ("com.arsdigita.portalserver.ui.admin.PortalCreateDispatcher"); */ // Try: new style legacy free application ApplicationType type = new ApplicationType("Portal Creator", // title PortalCreator.BASE_DATA_OBJECT_TYPE ); type.setDescription ("Creates portals."); type.save(); } /** * * @return */ private void loadPortalSitemapApplicationType() { // formerly private ApplicationType setupPortalSitemapper() { /* ApplicationType type = ApplicationType.createApplicationType( "portal-sitemap", "Portal Site Map", PortalSiteMap.BASE_DATA_OBJECT_TYPE); // Current code requires an apps specific dispatcher class. Has to be // modified to be able to create a legacy free app type. type.setDispatcherClass ("com.arsdigita.portalserver.ui.admin.PortalSiteMapDispatcher"); */ /* ApplicationSetup setup = new ApplicationSetup(s_log); setup.setApplicationObjectType(PortalSiteMap.BASE_DATA_OBJECT_TYPE); setup.setTitle("Portal Site Map"); setup.setDescription("Displays and manages Portals"); setup.setWorkspaceApplication(false); setup.setKey("portal-sitemap"); // setup.setStylesheet("/packages/portalserver/xsl/portal-sitemap.xsl"); setup.setDispatcherClass( "com.arsdigita.portalserver.ui.admin.PortalSiteMapDispatcher"); setup.setInstantiator(new ACSObjectInstantiator() { @Override protected DomainObject doNewInstance(DataObject dataObject) { return new PortalSiteMap(dataObject); } }); setup.run(); */ // return setup.run(); // Try: new style legacy free application ApplicationType type = new ApplicationType("Portal SiteMap", // title PortalSiteMap.BASE_DATA_OBJECT_TYPE ); type.setDescription ("Displays and manages Portals."); type.save(); } /* FORMERLY personal.Initializer */ /** * * @return */ private void loadPersonalPortalCreatorApplicationType() { // private ApplicationType loadPersonalPortalCreatorApplicationType() { // formerly private ApplicationType setupPersonalPortalCreatorApplication() { /* ApplicationType type = ApplicationType.createApplicationType( "personal-portal-creator", "Personal Portal Creator", PersonalPortalCreator.BASE_DATA_OBJECT_TYPE); type.setDescription ("Responsible for creating personal portals."); // Current code requires an apps specific dispatcher class. Has to be // modified to be able to create a legacy free app type. type.setDispatcherClass ("com.arsdigita.portalserver.personal.PersonalPortalCreatorDispatcher"); */ // Try: new style legacy free application ApplicationType type = new ApplicationType("Personal Portal Creator", // title PersonalPortalCreator.BASE_DATA_OBJECT_TYPE ); type.setDescription ("Displays and manages Portals."); type.save(); } private void loadPersonalPortalApplicationType() { // private ApplicationType loadPersonalPortalApplicationType() { // formerly private ApplicationType setupPersonalPortalApplication() { /* ApplicationType type = ApplicationType.createApplicationType( "personal-portal", "Personal Portal", PersonalPortal.BASE_DATA_OBJECT_TYPE); // Current code requires an apps specific dispatcher class. Has to be // modified to be able to create a legacy free app type. type.setDispatcherClass ("com.arsdigita.portalserver.personal.PersonalPortalDispatcher"); */ // Try: new style legacy free application ApplicationType type = new ApplicationType("Personal Portal", // title PersonalPortal.BASE_DATA_OBJECT_TYPE ); type.setDescription ("A portal for an individual."); type.save(); /* // XXX This must go after setup.run(). Need more elegant approach. // pboy: uses ResourceType.registerResourceTypeConfig() which registers // in a hash map. Therefore: not suitable for a loader, may have to be // moved into initializer! // new PersonalPortalConfig(); return type; */ } // //////////////////////////////////////////////////////////////////////// // // S e t u p o f P O R T A L a p p l i c a t i o n s // // //////////////////////////////////////////////////////////////////////// /** * Instantiate an application of type PortalSite with site wide administration * tools. */ private void setupAdminPortal() { PortalSite ps = PortalSite.createPortalSite("administration", "Administration", null); ps.setMission("Administration Portal"); ps.save(); } /** * Setup an PortalServer Administration Instance as legacy compatible * application. * * @param type */ // private void setupPortalSiteAdminInstance(final ApplicationType type) { private void setupPortalSiteAdminInstance() { if (!Application.isInstalled(PSAdmin.BASE_DATA_OBJECT_TYPE, "/portal-admin/")) { s_log.info("There is no Portal Admin application instance on " + "/portal-admin/. Installing now."); // KernelExcursion ex = new KernelExcursion() { // protected void excurse() { // setParty(Kernel.getSystemParty()); Application app = Application.createApplication (PSAdmin.BASE_DATA_OBJECT_TYPE, "portal-admin", "Site Administration", null); app.save(); // } // }; // ex.run(); s_log.info("Done installing Portal Admin on /portal-admin/."); } } /* FORMERLY ui.admin.Initializer */ private void setupPortalCreatorInstance() { // formerly private void setupPortalCreate(ApplicationType type) { if (!Application.isInstalled(PortalCreator.BASE_DATA_OBJECT_TYPE, "/portal-admin/portal-create/")) { Application admin = Application.retrieveApplicationForPath("/portal-admin/"); if (admin == null) { s_log.warn("There is no application at /portal-admin/ so I " + "can't install the portal create application."); return; } s_log.info("There is no Portal Creator application instance " + "on /user-profile/. Installing now."); Application app = Application.createApplication (PortalCreator.BASE_DATA_OBJECT_TYPE, "portal-create", "Create Top-Level Portals", admin); app.setDescription("Create top-level portals."); app.save(); s_log.info("Done installing Portal Creator on " + "/portal-admin/portal-create/."); } } private void setupPortalSitemapInstance() { // private void setupPortalSitemapInstance(ApplicationType type) { if (!Application.isInstalled(PortalSiteMap.BASE_DATA_OBJECT_TYPE, "/portal-admin/portal-sitemap/")) { Application admin = Application.retrieveApplicationForPath("/portal-admin/"); if (admin == null) { s_log.warn("There is no application at /portal-admin/ so I " + "can't install the portal sitemap application."); return; } s_log.warn("There is no Portal Site Map application instance " + "on /portal-admin/. Installing now."); Application app = Application.createApplication // (type, "portal-sitemap", "Portal Site Map", admin); (PortalSiteMap.BASE_DATA_OBJECT_TYPE, "portal-sitemap", "Portal Site Map", admin); app.setDescription("Portal Site Map"); app.save(); s_log.warn("Done installing Portal Site Map on " + "/portal-admin/portal-sitemap/."); } } /* FORMERLY personal.Initializer */ private void setupPersonalPortalCreatorInstance() { // Create an instance of the personal portal creator at // /personal-portal/. boolean creatorInstalled = Application.isInstalled (PersonalPortalCreator.BASE_DATA_OBJECT_TYPE, "/personal-portal/"); if (!creatorInstalled) { // No KernelExcursion needed here because Loader already has it. // KernelExcursion ex = new KernelExcursion() { // protected void excurse() { // setParty(Kernel.getSystemParty()); // creates either a legacy free application or a legacy compatible, // depending of its application type. Application creatorApp = Application.createApplication (PersonalPortalCreator.BASE_DATA_OBJECT_TYPE, "personal-portal", "Personal Portal Creator", null); creatorApp.save(); // } // }; // ex.run(); } } // //////////////////////////////////////////////////////////////////////// // // S e t u p o f i n t e r n a l p o r t l e t s // // //////////////////////////////////////////////////////////////////////// /** * Creates a PortletType (persistent object) for AgentPortlet. * Instances (Portlets) are created by user interface or programmatically * by configuration. */ private void setupAgentPortlet() { PortletSetup setup = new PortletSetup(s_log); setup.setPortletObjectType (AgentPortlet.BASE_DATA_OBJECT_TYPE); setup.setTitle("Agent"); setup.setDescription ("Acts as agent or proxy for another portlet."); setup.setProfile(PortletType.WIDE_PROFILE); setup.setInstantiator(new ACSObjectInstantiator() { @Override public DomainObject doNewInstance(DataObject dataObject) { return new AgentPortlet(dataObject); } }); setup.run(); } /** * Creates a PortletType (persistent object) for ApplicationDirectoryPortlet. * Instances (Portlets) are created by user interface or programmatically * by configuration. */ private void setupApplicationDirectoryPortlet() { AppPortletSetup setup = new AppPortletSetup(s_log); setup.setPortletObjectType (ApplicationDirectoryPortlet.BASE_DATA_OBJECT_TYPE); setup.setTitle("Application Directory"); setup.setDescription("Provides links to the workspace's applications."); setup.setProfile(PortletType.NARROW_PROFILE); setup.setPortalApplication(true); setup.setInstantiator(new ACSObjectInstantiator() { @Override public DomainObject doNewInstance(DataObject dataObject) { return new ApplicationDirectoryPortlet(dataObject); } }); setup.run(); } /** * */ private void setupMyPortalsPortlet() { AppPortletSetup setup = new AppPortletSetup(s_log); setup.setPortletObjectType (MyPortalsPortlet.BASE_DATA_OBJECT_TYPE); setup.setTitle("My Portals"); setup.setDescription ("Displays links to portals to which you belong."); setup.setProfile(PortletType.NARROW_PROFILE); setup.setPortalApplication(true); setup.setInstantiator(new ACSObjectInstantiator() { @Override public DomainObject doNewInstance(DataObject dataObject) { return new MyPortalsPortlet(dataObject); } }); setup.run(); } /** * Creates a PortletType (persistent object) for PortalNavigatorPortlet. * Instances (Portlets) are created by user interface or programmatically * by configuration. */ private void setupPortalNavigatorPortlet() { // Create a PortletType for PortalNavigatorPortlet AppPortletSetup setup = new AppPortletSetup(s_log); setup.setPortletObjectType (PortalNavigatorPortlet.BASE_DATA_OBJECT_TYPE); setup.setTitle("Portal Navigator"); setup.setDescription ("Provides links to portal associated with the current " + "portal."); setup.setProfile(PortletType.NARROW_PROFILE); setup.setPortalApplication(true); setup.setInstantiator(new ACSObjectInstantiator() { @Override public DomainObject doNewInstance(DataObject dataObject) { return new PortalNavigatorPortlet(dataObject); } }); setup.run(); } /** * Creates a PortletType (persistent object) for PortalSummaryPortlet. * Instances (Portlets) are created by user interface or programmatically * by configuration. */ private void setupPortalSummaryPortlet() { AppPortletSetup setup = new AppPortletSetup(s_log); setup.setPortletObjectType (PortalSummaryPortlet.BASE_DATA_OBJECT_TYPE); setup.setTitle("Portal Summary"); setup.setProfile(PortletType.NARROW_PROFILE); setup.setPortalApplication(true); setup.setInstantiator(new ACSObjectInstantiator() { @Override public DomainObject doNewInstance(DataObject dataObject) { return new PortalSummaryPortlet(dataObject); } }); setup.run(); } // //////////////////////////////////////////////////////////////////////// // // // //////////////////////////////////////////////////////////////////////// /** * Determines the ApplicationType mounted at the root node (as a package type) * and replaces its dispatcher class with its own. * This dispatcher class sets the class which is used for login. The class is * persisted into database. * * Root URL request will be redirected to the users portal page (or login) * * @ deprecated the method used by the dispatcher in its current version is * no longer available. Currently without direct replacement. The current * version of core now uses a different method to determine the page at * root address. So this method is of no use anymore! * Whether it is used or not makes no difference. */ // USED BY loadSubsite() which es meant to replace the applications mounted // at root url dispatcher by portalserver dispatcher. Not used anymore, the // page at root address is now determined in a different way. /* private void loadSubsite() { // String stylesheetName = ""; String sDispatcher = ""; SiteNode rootNode = SiteNode.getRootSiteNode(); PackageInstance packageInstance = rootNode.getPackageInstance(); if (packageInstance == null) { throw new IllegalStateException ("No package instance mounted at the root node"); } PackageType subsite = packageInstance.getType(); // getType() returns a disconnected object. To get a connected object // we do a findByKey(key). String packageKey = subsite.getKey(); try { subsite = PackageType.findByKey(packageKey); } catch (DataObjectNotFoundException e) { throw new IllegalStateException ("Package Type with key \"" + packageKey + "\" was not found.\n"); } // Create default stylesheet. // stylesheetName = "/packages/login/xsl/login_ps_en.xsl"; // s_log.warn("Adding stylesheet: " + stylesheetName); // subsite.addStylesheet(Stylesheet.createStylesheet(stylesheetName)); // Set subsite dispatcher class. subsite.setDispatcherClass( "com.arsdigita.portalserver.pslogin.PSSubsiteDispatcher"); } */ /** * PortalSite may have its own styling elements (portal themes). Loads some * default styles which are available in a drop down menue for a user. */ private void buildDefaultThemes() { Theme theme0 = new Theme("Red Hat"); theme0.setDescription("A cool corporate theme"); theme0.setContextBarColor("#E1E1E1"); theme0.setContextBarTextColor("#3F3F3F"); theme0.setActiveTabColor("#a21e1e"); theme0.setInactiveTabColor("#dddddd"); theme0.setInactiveTabTextColor("#555555"); theme0.setActiveTabTextColor("#ffffff"); theme0.setTopRuleColor("#a21e1e"); theme0.setBottomRuleColor("#a21e1e"); theme0.setPortletHeaderColor("#a21e1e"); theme0.setPortletIconColor("#a21e1e"); theme0.setPortletHeaderTextColor("#ffffff"); theme0.setPageBGColor("#ffffff"); theme0.setBodyTextColor("#000000"); theme0.setNarrowBGColor("#dddddd"); theme0.save(); /* Theme theme1 = new Theme("Celtic Fever"); theme1.setDescription("A theme for Celtic NBA fans"); theme1.setContextBarColor("#008800"); theme1.setActiveTabColor("#008800"); theme1.setInactiveTabColor("#002200"); theme1.setInactiveTabTextColor("#ffffff"); theme1.setActiveTabTextColor("#ffffff"); theme1.setTopRuleColor("#008800"); theme1.setBottomRuleColor("#008800"); theme1.setPortletHeaderColor("#006600"); theme1.setPortletIconColor("#006600"); theme1.setPortletHeaderTextColor("#000000"); theme1.setPageBGColor("#ffffff"); theme1.setPageBGImage("/assets/cw/workspace/bg_bos.gif"); theme1.setBodyTextColor("#000000"); theme1.setNarrowBGColor("#ddeedd"); theme1.save(); */ Theme theme2 = new Theme("Bright Day"); theme2.setDescription("A sunny, cloudless sky"); theme2.setContextBarColor("#003366"); theme2.setContextBarTextColor("#FFFFFF"); theme2.setActiveTabColor("#93bee2"); theme2.setInactiveTabColor("#d8e8f5"); theme2.setInactiveTabTextColor("#000000"); theme2.setActiveTabTextColor("#000000"); theme2.setTopRuleColor("#93bee2"); theme2.setBottomRuleColor("#93bee2"); theme2.setPortletHeaderColor("#cccccc"); theme2.setPortletIconColor("#cccccc"); theme2.setPortletHeaderTextColor("#000000"); theme2.setPageBGColor("#ffffff"); theme2.setPageBGImage(""); theme2.setNarrowBGColor("#dddddd"); theme2.setBodyTextColor("#000000"); theme2.save(); Theme theme3 = new Theme("Harvest"); theme3.setDescription("High Heat"); theme3.setContextBarColor("#ff9966"); theme3.setContextBarTextColor("#ffffff"); theme3.setActiveTabColor("#ff9966"); theme3.setInactiveTabColor("#ffcc99"); theme3.setInactiveTabTextColor("#000000"); theme3.setActiveTabTextColor("#000000"); theme3.setTopRuleColor("#ff9966"); theme3.setBottomRuleColor("#ff9966"); theme3.setPortletHeaderColor("#ff9966"); theme3.setPortletIconColor("#ff9966"); theme3.setPortletHeaderTextColor("#000000"); theme3.setPageBGColor("#ffffff"); theme3.setPageBGImage(""); theme3.setNarrowBGColor("#ffffcc"); theme3.setBodyTextColor("#000000"); theme3.save(); Theme theme4 = new Theme("Desert"); theme4.setDescription("High Heat"); theme4.setContextBarColor("#cccc99"); theme4.setContextBarTextColor("#FFFFFF"); theme4.setActiveTabColor("#cccc99"); theme4.setInactiveTabColor("#ededca"); theme4.setInactiveTabTextColor("#000000"); theme4.setActiveTabTextColor("#000000"); theme4.setTopRuleColor("#cccc99"); theme4.setBottomRuleColor("#cccc99"); theme4.setPortletHeaderColor("#cccc99"); theme4.setPortletIconColor("#cccc99"); theme4.setPortletHeaderTextColor("#000000"); theme4.setPageBGColor("#ffffff"); theme4.setPageBGImage(""); theme4.setNarrowBGColor("#ffffcc"); theme4.setBodyTextColor("#000000"); theme4.save(); Theme theme5 = new Theme("Stars and Bars"); theme5.setDescription("Patriotic"); theme5.setContextBarColor("#cc0000"); theme5.setContextBarTextColor("#FFFFFF"); theme5.setActiveTabColor("#cc0000"); theme5.setInactiveTabColor("#ffffff"); theme5.setInactiveTabTextColor("#000000"); theme5.setActiveTabTextColor("#ffffff"); theme5.setTopRuleColor("#cc0000"); theme5.setBottomRuleColor("#cc0000"); theme5.setPortletHeaderColor("#cc0000"); theme5.setPortletIconColor("#cc0000"); theme5.setPortletHeaderTextColor("#ffffff"); theme5.setPageBGColor("#ffffff"); theme5.setPageBGImage("/assets/cw/backgrounds/stars.gif"); theme5.setNarrowBGColor("#eeeeee"); theme5.setBodyTextColor("#000000"); theme5.save(); } }