diff --git a/ccm-core/application.xml b/ccm-core/application.xml index c41a22eeb..6cc6a9fe2 100755 --- a/ccm-core/application.xml +++ b/ccm-core/application.xml @@ -3,7 +3,7 @@ name="ccm-core" prettyName="Core" version="6.6.1" - release="1" + release="2" shared="true" webapp="ROOT" buildHooks="build-hooks.xml"> diff --git a/ccm-core/src/com/arsdigita/core/Initializer.java b/ccm-core/src/com/arsdigita/core/Initializer.java index b12d2182a..c75bfae6b 100755 --- a/ccm-core/src/com/arsdigita/core/Initializer.java +++ b/ccm-core/src/com/arsdigita/core/Initializer.java @@ -24,6 +24,7 @@ import com.arsdigita.domain.DomainObject; import com.arsdigita.domain.DomainObjectInstantiator; import com.arsdigita.kernel.ACSObjectInstantiator; import com.arsdigita.loader.CoreLoader; +import com.arsdigita.mimetypes.MimeType; import com.arsdigita.persistence.DataObject; import com.arsdigita.persistence.Session; import com.arsdigita.persistence.SessionManager; @@ -37,8 +38,10 @@ import com.arsdigita.runtime.LegacyInitializer; import com.arsdigita.runtime.OptionalLegacyInitializer; import com.arsdigita.runtime.PDLInitializer; import com.arsdigita.runtime.RuntimeConfig; +import com.arsdigita.toolbox.CharsetEncodingProvider; import com.arsdigita.ui.admin.Admin; import com.arsdigita.ui.sitemap.SiteMap; +import com.arsdigita.util.URLRewriter; import com.arsdigita.xml.FactoriesSetup; import com.arsdigita.web.Host; import com.arsdigita.web.WebApp; @@ -82,7 +85,7 @@ public class Initializer extends CompoundInitializer { ("ccm-core.pdl.mf", new NameFilter(DbHelper.getDatabaseSuffix(database), "pdl")))); - // add(new com.arsdigita.ui.Initializer()); + add(new com.arsdigita.ui.Initializer()); add(new com.arsdigita.portal.Initializer()); add(new com.arsdigita.search.Initializer()); add(new com.arsdigita.search.lucene.Initializer()); @@ -93,6 +96,10 @@ public class Initializer extends CompoundInitializer { add(new OptionalLegacyInitializer("enterprise.init")); } + /** + * + * @param e + */ @Override public final void init(final DomainInitEvent e) { super.init(e); @@ -155,6 +162,41 @@ public class Initializer extends CompoundInitializer { } }); +/* MimeType used to have its own initializer in the old initialize system + * based on enterprise.ini. This initializer performed a DomainObjectFactgory + * instantiation and some handling of INSO filter, an Oracle db related + * filter for intermedia textsearch. INSO filter handling is moved to + * intermedia search engine so no configuration was left in the domain + * instantiation could be moved to the central core initializer + From old Initializer system: + + if (DomainObjectFactory.getInstantiator + (MimeType.BASE_DATA_OBJECT_TYPE) == null) { + DomainObjectInstantiator instMimeType = new DomainObjectInstantiator() { + public DomainObject doNewInstance(DataObject dataObject) { + return new MimeType(dataObject); + } + }; + DomainObjectFactory.registerInstantiator + (MimeType.BASE_DATA_OBJECT_TYPE, instMimeType); + } + +*/ + e.getFactory().registerInstantiator + (MimeType.BASE_DATA_OBJECT_TYPE, + new DomainObjectInstantiator() { + public DomainObject doNewInstance(DataObject dataObject) { + return new MimeType(dataObject); + } + public DomainObjectInstantiator + resolveInstantiator(DataObject obj) { + return this; + } + }); + + + + // register the document converters Converter converter = new PDFConverter(); ConverterRegistry.registerConverter(converter, @@ -176,9 +218,16 @@ public class Initializer extends CompoundInitializer { ConverterRegistry.registerConverter(converter, converter.getMimeTypes()); + // Initialize the the CharsetEncodingProvider internal data structure + URLRewriter.addParameterProvider(new CharsetEncodingProvider()); + s_log.info("Core init(DomainInitEvent) done"); } + /** + * + * @param e + */ public final void init(final LegacyInitEvent e) { super.init(e); diff --git a/ccm-core/src/com/arsdigita/core/enterprise.init b/ccm-core/src/com/arsdigita/core/enterprise.init index eb04442e4..e07bd6c2b 100755 --- a/ccm-core/src/com/arsdigita/core/enterprise.init +++ b/ccm-core/src/com/arsdigita/core/enterprise.init @@ -47,34 +47,34 @@ init com.arsdigita.kernel.security.Initializer { // Set to true when using intermedia search -init com.arsdigita.mimetypes.MimeTypeInitializer { - INSOFilterEnabled = false; -} - +//-init com.arsdigita.mimetypes.LegacyMimeTypeInitializer { +//- INSOFilterEnabled = false; +//-} +// Should get integrated into the same configuration file as parameter +// waf.debug, i.e. ccm-core/kernel.properties. init com.arsdigita.webdevsupport.Initializer { active = false; } -init com.arsdigita.toolbox.CharsetEncodingProviderInitializer { } +// init com.arsdigita.toolbox.CharsetEncodingProviderInitializer { } -init com.arsdigita.ui.LegacyInitializer { +// init com.arsdigita.ui.LegacyInitializer { // If using the default SimplePage class, the following // two parameters specify the class names of the bebop // components to (optionally) add to margins of pages // The is default set of page components - defaultLayout = { - { "top", "com.arsdigita.ui.UserBanner" }, - { "bottom", "com.arsdigita.ui.SiteBanner" }, - { "bottom", "com.arsdigita.ui.DebugPanel" } +// defaultLayout = { +// { "top", "com.arsdigita.ui.UserBanner" }, +// { "bottom", "com.arsdigita.ui.SiteBanner" }, +// { "bottom", "com.arsdigita.ui.DebugPanel" } +// // { "left", "com.arsdigita.x.y.z" }, +// // { "right", "com.arsdigita.x.y.z" } +// }; -// { "left", "com.arsdigita.x.y.z" }, -// { "right", "com.arsdigita.x.y.z" } - }; - -} +// } // init com.arsdigita.portal.Initializer { } // init com.arsdigita.portal.LegacyInitializer { } diff --git a/ccm-core/src/com/arsdigita/loader/PackageLoader.java b/ccm-core/src/com/arsdigita/loader/PackageLoader.java index f827f3b69..06be1c197 100755 --- a/ccm-core/src/com/arsdigita/loader/PackageLoader.java +++ b/ccm-core/src/com/arsdigita/loader/PackageLoader.java @@ -45,7 +45,7 @@ import com.arsdigita.util.parameter.CompoundParameterReader; import com.arsdigita.util.parameter.ParameterReader; /** - * PackageLoader + * Base class which loaders of all modules extend. * * @author Rafael H. Schloming <rhs@mit.edu> * @version $Id: PackageLoader.java 2070 2010-01-28 08:47:41Z pboy $ @@ -118,18 +118,11 @@ public abstract class PackageLoader extends AbstractScript { } /** + * * * @param args * @return - * //@deprecated use reader() instead - * but seems not to be used by any module */ - //public static ParameterLoader loader(String[] args) { - // return ( this.reader(args) ); - // return null; - // } - - public static ParameterReader reader(String[] args) { CompoundParameterReader result = new CompoundParameterReader(); result.add(new JavaPropertyReader(props(args))); diff --git a/ccm-core/src/com/arsdigita/mimetypes/MimeTypeInitializer.java b/ccm-core/src/com/arsdigita/mimetypes/LegacyMimeTypeInitializer.java similarity index 94% rename from ccm-core/src/com/arsdigita/mimetypes/MimeTypeInitializer.java rename to ccm-core/src/com/arsdigita/mimetypes/LegacyMimeTypeInitializer.java index 9b605f502..9393aa3e4 100755 --- a/ccm-core/src/com/arsdigita/mimetypes/MimeTypeInitializer.java +++ b/ccm-core/src/com/arsdigita/mimetypes/LegacyMimeTypeInitializer.java @@ -42,15 +42,15 @@ import java.math.BigDecimal; * @author Stanislav Freidin * @version $Revision: #15 $ $Date: 2004/08/16 $ */ -public class MimeTypeInitializer extends BaseInitializer { - private static final Logger s_log = Logger.getLogger(MimeTypeInitializer.class); +public class LegacyMimeTypeInitializer extends BaseInitializer { + private static final Logger s_log = Logger.getLogger(LegacyMimeTypeInitializer.class); private final Configuration m_conf = new Configuration(); public static final String INSO_FILTER_WORKS = "INSOFilterEnabled"; /** * Update status table with new hash code - **/ + */ private void updateStatus() { MimeTypeStatus ms = MimeTypeStatus.getMimeTypeStatus(); if ( isFilterEnabled() ) { @@ -63,7 +63,7 @@ public class MimeTypeInitializer extends BaseInitializer { /** * Register a trivial instantiator for MimeType - **/ + */ private static void registerInstantiator() { if (DomainObjectFactory.getInstantiator (MimeType.BASE_DATA_OBJECT_TYPE) == null) { @@ -77,7 +77,7 @@ public class MimeTypeInitializer extends BaseInitializer { } } - public MimeTypeInitializer() throws InitializationException { + public LegacyMimeTypeInitializer() throws InitializationException { m_conf.initParameter (INSO_FILTER_WORKS, "Set to true if you have a working INSO filter", @@ -105,8 +105,8 @@ public class MimeTypeInitializer extends BaseInitializer { disableFilter(); } - testINSOFilter(); - updateStatus(); + // testINSOFilter(); + // updateStatus(); registerInstantiator(); txn.commitTxn(); @@ -118,6 +118,10 @@ public class MimeTypeInitializer extends BaseInitializer { protected void doShutdown () { } + /** + * Provides a routine test whether the INSO filter works correctly. Disables + * INSO filter if testing fails. + */ private void testINSOFilter() { if ( !isFilterEnabled() ) { s_log.info("Not testing INSO filter."); diff --git a/ccm-core/src/com/arsdigita/search/intermedia/Initializer.java b/ccm-core/src/com/arsdigita/search/intermedia/Initializer.java index 2b856ad8a..f9b8e951a 100755 --- a/ccm-core/src/com/arsdigita/search/intermedia/Initializer.java +++ b/ccm-core/src/com/arsdigita/search/intermedia/Initializer.java @@ -1,6 +1,4 @@ /* - * 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 @@ -19,12 +17,10 @@ package com.arsdigita.search.intermedia; import com.arsdigita.db.DbHelper; -// import com.arsdigita.initializer.Configuration; -// import com.arsdigita.initializer.InitializationException; +import com.arsdigita.mimetypes.MimeTypeStatus; +import com.arsdigita.mimetypes.converters.ConvertFormat; import com.arsdigita.runtime.ConfigError; import com.arsdigita.runtime.ContextCloseEvent; -import com.arsdigita.runtime.DataInitEvent; -import com.arsdigita.runtime.DomainInitEvent; import com.arsdigita.runtime.ContextInitEvent; import com.arsdigita.search.FilterType; import com.arsdigita.search.IndexerType; @@ -33,6 +29,10 @@ import com.arsdigita.search.Search; import com.arsdigita.search.filters.CategoryFilterType; import com.arsdigita.search.filters.ObjectTypeFilterType; import com.arsdigita.search.filters.PermissionFilterType; +import com.arsdigita.util.Assert; +import com.arsdigita.util.StringUtils; + +import java.math.BigDecimal; import org.apache.log4j.Logger; @@ -51,9 +51,10 @@ public class Initializer extends com.arsdigita.runtime.GenericInitializer { // Creates a s_logging category with name = to the full name of class public static final Logger s_log = Logger.getLogger(Initializer.class); + private static final IntermediaConfig conf = IntermediaConfig.getConfig(); /** - * + * Constructor */ public Initializer() { } @@ -64,9 +65,27 @@ public class Initializer extends com.arsdigita.runtime.GenericInitializer { * method. * * @param evt The context init event. - **/ - + */ + @Override public void init(ContextInitEvent evt) { + + // In any case we have to check whether the INSO filter is set + // correctly. + // If it's not Oracle, INSO filters don't exist, so override whatever is + // configured in registry. + final boolean isNonOracleDB = DbHelper.getDatabase() != DbHelper.DB_ORACLE; + if (conf.isINSOFilterEnabled() && isNonOracleDB) { + s_log.debug("INSO filter is set to true using a non Oracle database. " + + "This is not allowed. Setting to false. Database=" + + DbHelper.getDatabaseName(DbHelper.getDatabase())); + + // silently disable filter + MimeTypeStatus ms = MimeTypeStatus.getMimeTypeStatus(); + ms.setInsoFilterWorks(new BigDecimal(0)); + ms.save(); + + } + if (Search.getConfig().isIntermediaEnabled()) { if (DbHelper.getDatabase() != DbHelper.DB_ORACLE) { @@ -75,8 +94,15 @@ public class Initializer extends com.arsdigita.runtime.GenericInitializer { DbHelper.getDatabaseName(DbHelper.getDatabase())); } - IntermediaConfig conf = IntermediaConfig.getConfig(); - + // update INSO filter status + MimeTypeStatus ms = MimeTypeStatus.getMimeTypeStatus(); + if (conf.isINSOFilterEnabled() && testINSOFilter() ) { + ms.setInsoFilterWorks(new BigDecimal(1)); + } else { + ms.setInsoFilterWorks(new BigDecimal(0)); + } + ms.save(); + // Multiply by 1000 to convert from seconds to milliseconds BuildIndex.setParameterValues( conf.getTimerDelay() * 1000, conf.getSyncDelay() * 1000, @@ -94,14 +120,17 @@ public class Initializer extends com.arsdigita.runtime.GenericInitializer { new CategoryFilterType() }, new BaseQueryEngine()); - } else { - s_log.debug("Intermedia search engine not enabled. Initialization skipped."); - } + } else { + s_log.debug("Intermedia search engine not enabled. Initialization skipped."); + } } /** - * + * Implementation of the {@link Initializer#init(ContextCloseEvent)} + * method which stops the background thread started by + * {@link Initializer#init(ContextInitEvent)} initialization method */ + @Override public void close(ContextCloseEvent evt) { if (Search.getConfig().isIntermediaEnabled()) { BuildIndex.stopTimer(); @@ -109,4 +138,93 @@ public class Initializer extends com.arsdigita.runtime.GenericInitializer { } + + /** + * Provides a routine test whether the INSO filter works correctly. + * + * @return true if INSO Filter test passed, false otherwise. + */ + private boolean testINSOFilter() { + + Assert.isTrue(DbHelper.getDatabase() == DbHelper.DB_ORACLE, + "Testing INSO filter on non Oracle DB! Shouldn't happen!"); + + s_log.info("Starting INSO filter test. If server hangs here,\n" + + " kill the job, then change your enterprise.init setting;' in \n" + + " enterprise.init com.arsdigita.cms.installer.Initializer."); + + String actual = ConvertFormat.toHTML(rtfTestFile.getBytes()); + + if (actual == null) { + s_log.warn("INSO Filter test failed. " + + "Unable to convert test rtf document to html."); + s_log.warn("INSO Filter test Expected: '" + rtfTestFileHTML + "'"); + s_log.warn("INSO Filter test Got: '" + actual + "'"); + return false; + } + + // remove white space before doing matching. In case version + // of INSO filter changes. + final String expected = StringUtils. + stripWhiteSpace(rtfTestFileHTML).toLowerCase(); + + actual = StringUtils.stripWhiteSpace(actual).toLowerCase(); + if (expected.equals(actual)) { + s_log.info("INSO Filter test passed."); + return true; + } else if (actual.startsWith(" = 0 && + actual.indexOf("this app uses the intermedia inso " + + "filtering to automatically convert " + + "from an rtf format to html format.") >= 0 && + actual.endsWith("")) { + s_log.info("INSO Filter test passed."); + return true; + } else { + s_log.warn("INSO Filter test failed. " + + "(Will not be able to convert documents to "+ + "html format by file uploading.)"); + s_log.warn("INSO Filter test Expected: '" + expected + "'"); + s_log.warn("Got: '" + actual + "'"); + return false ; + } + } + + + // rtf file used to test inso filter conversion to html + private static final String rtfTestFile = + "{\\rtf1\\ansi\\deff0\n" + + "{\\fonttbl{\\f0\\froman\\fprq2\\fcharset0 Times;}}\n" + + "{\\colortbl\\red0\\green0\\blue0;\\red255\\green255\\blue" + + "255;\\red128\\green128\\blue128;}\n" + + "{\\stylesheet{\\s1\\snext1 Standard;}\n}\n" + + "{\\info{\\comment StarWriter}{\\vern5690}}\\deftab720\n" + + "{\\*\\pgdsctbl\n" + + "{\\pgdsc0\\pgdscuse195\\pgwsxn12240\\pghsxn15840\\marglsxn" + + "1800\\margrsxn1800\\margtsxn1440\\margbsxn1440\\pgdscnxt0 Standard;}}\n" + + "\\paperh15840\\paperw12240\\margl1800\\margr1800\\margt" + + "1440\\margb1440\\sectd\\sbknone\\pgwsxn12240\\pghsxn" + + "15840\\marglsxn1800\\margrsxn1800\\margtsxn1440\\margbsxn" + + "1440\\ftnbj\\ftnstart1\\ftnrstcont\\ftnnar\\aenddoc\\aftnr" + + "stcont\\aftnstart1\\aftnnrlc\n" + + "\\pard\\plain \\s1\\fs40\\qc test rtf file.\n" + + "\\par \\pard\\plain \\s1 \n" + + "\\par This app uses the interMedia INSO filtering to " + + "automatically convert from an RTF format to html format.\n" + + "\\par \n" + + "\\par But lets see if it really works.\n" + + "\\par \n\\par }\n"; + + + // The following should be the result of converting rtfTestFile + // to html using the inso filter. + private static final String rtfTestFileHTML = + "\n" + + "

test rtf file. 

\n" + + "

This app uses the interMedia INSO filtering to \n" + + "automatically convert from an RTF format to html \n" + + "format. 

\n" + + "

But lets see if it really works.

\n" + + "\n"; + } diff --git a/ccm-core/src/com/arsdigita/search/intermedia/IntermediaConfig.java b/ccm-core/src/com/arsdigita/search/intermedia/IntermediaConfig.java index ca40ecfe8..94f1d412d 100644 --- a/ccm-core/src/com/arsdigita/search/intermedia/IntermediaConfig.java +++ b/ccm-core/src/com/arsdigita/search/intermedia/IntermediaConfig.java @@ -70,6 +70,11 @@ public class IntermediaConfig extends AbstractConfig { private BooleanParameter m_stemming = new BooleanParameter ("waf.intermedia.stemming", Parameter.REQUIRED, Boolean.FALSE); + /** Enable INSO filter for (advanced) intermedia text search. Set to true + when using intermedia search. */ + private Parameter m_insoFilterEnabled = new BooleanParameter + ("waf.intermedia.inso_filter_enabled", Parameter.REQUIRED, + Boolean.FALSE); public IntermediaConfig() { @@ -79,6 +84,7 @@ public class IntermediaConfig extends AbstractConfig { register(m_maxIndexingTime); register(m_indexingRetryDelay); register(m_stemming); + register(m_insoFilterEnabled); loadInfo(); } @@ -143,4 +149,9 @@ public class IntermediaConfig extends AbstractConfig { } + public boolean isINSOFilterEnabled() { + return ((Boolean)get(m_insoFilterEnabled)).booleanValue(); + + } + } diff --git a/ccm-core/src/com/arsdigita/ui/Initializer.java b/ccm-core/src/com/arsdigita/ui/Initializer.java index ac0f27f38..a07840480 100755 --- a/ccm-core/src/com/arsdigita/ui/Initializer.java +++ b/ccm-core/src/com/arsdigita/ui/Initializer.java @@ -19,11 +19,6 @@ package com.arsdigita.ui; -// import com.arsdigita.domain.DomainObject; -// import com.arsdigita.domain.DomainObjectInstantiator; -// import com.arsdigita.kernel.ACSObjectInstantiator; -// import com.arsdigita.persistence.DataObject; -// import com.arsdigita.runtime.CompoundInitializer; import com.arsdigita.runtime.ContextInitEvent; import com.arsdigita.runtime.ConfigError; @@ -40,7 +35,6 @@ import org.apache.log4j.Logger; * @author pb * @version $Id: $ */ -// public class Initializer extends CompoundInitializer { public class Initializer extends com.arsdigita.runtime.GenericInitializer { /** Creates a s_logging category with name = to the full name of class */ @@ -51,7 +45,7 @@ public class Initializer extends com.arsdigita.runtime.GenericInitializer { // s_log.debug("ui configuration loaded."); /** - * + * Constructor */ public Initializer() { } @@ -93,7 +87,13 @@ public class Initializer extends com.arsdigita.runtime.GenericInitializer { } + /** + * Helper method creates the layout definitions + * @param desc + * @return + */ private SimplePageLayout buildLayout(List desc) { + SimplePageLayout layout = new SimplePageLayout(); Iterator comps = desc.iterator(); diff --git a/ccm-core/src/com/arsdigita/ui/LegacyInitializer.java b/ccm-core/src/com/arsdigita/ui/LegacyInitializer.java.nolongerInUse similarity index 100% rename from ccm-core/src/com/arsdigita/ui/LegacyInitializer.java rename to ccm-core/src/com/arsdigita/ui/LegacyInitializer.java.nolongerInUse diff --git a/ccm-core/src/com/arsdigita/ui/UIConfig.java b/ccm-core/src/com/arsdigita/ui/UIConfig.java index 2c9a6fcf5..a19448cbb 100644 --- a/ccm-core/src/com/arsdigita/ui/UIConfig.java +++ b/ccm-core/src/com/arsdigita/ui/UIConfig.java @@ -20,12 +20,12 @@ package com.arsdigita.ui; import com.arsdigita.runtime.AbstractConfig; -import com.arsdigita.util.parameter.ArrayOfStringArrayParameter; +import com.arsdigita.util.StringUtils; import com.arsdigita.util.parameter.StringArrayParameter; import com.arsdigita.util.parameter.Parameter; import java.util.Arrays; -// import java.util.ArrayList; +import java.util.ArrayList; import java.util.List; import org.apache.log4j.Logger; @@ -63,33 +63,38 @@ public class UIConfig extends AbstractConfig { /** * Default set of page component objects defining the default layout for the - * SimplePage class. - * Format: list + * SimplePage class. * + * Format expected by clients: + * list { { "margin_position", "class_name_of_bebop_component"} , + * { "margin_position", "class_name_of_bebop_component"} , + * ... + * { "margin_position", "class_name_of_bebop_component"} + * } + * Elements are optional and may have 0 ...n pairs of position/classname. + * + * Example: + * defaultLayout = { { "top", "com.arsdigita.ui.UserBanner" }, + * { "bottom", "com.arsdigita.ui.SiteBanner" }, + * { "bottom", "com.arsdigita.ui.DebugPanel" } + * { "left", "com.arsdigita.x.y.z" }, + * { "right", "com.arsdigita.x.y.z" } + * }; + * + * Currently there is no list parameter model available. We use a + * StringArrayParameter instead, where each String element contains a + * colon separated position:class entry. It is converted to a list by + * the getter method. */ -// From the OLD initializer: -// If using the default SimplePage class, the following -// two parameters specify the class names of the bebop -// components to (optionally) add to margins of pages - -// The is default set of page components -// defaultLayout = { -// { "top", "com.arsdigita.ui.UserBanner" }, -// { "bottom", "com.arsdigita.ui.SiteBanner" }, -// { "bottom", "com.arsdigita.ui.DebugPanel" } -// -// // { "left", "com.arsdigita.x.y.z" }, -// // { "right", "com.arsdigita.x.y.z" } -// }; - + // Quick 'md Dirty, we reeally need a StringListParameter class private final Parameter m_defaultLayout = new StringArrayParameter( "waf.ui.default_layout", Parameter.REQUIRED, new String[] { "top:com.arsdigita.ui.UserBanner" - ,"bottom:com.arsdigita.ui.SiteBanner" - ,"bottom:com.arsdigita.ui.DebugPanel" + ,"bottom:com.arsdigita.ui.SiteBanner" + ,"bottom:com.arsdigita.ui.DebugPanel" //,"left:com.arsdigita.x.y.zl", //,"right:com.arsdigita.x.y.zr", } @@ -97,7 +102,29 @@ public class UIConfig extends AbstractConfig { /** * The customized layout for applications using the SimplePage class - * Format: list + * Format: list presumably same format as m_defaultLayout. details unknown + * + * According to a comment in old enterprise.init file: + * // Application specific page components + * // applicationLayouts = { + * // { "forums", + * // { + * // { "top", "com.arsdigita.x.y.z" }, + * // { "left", "com.arsdigita.x.y.z" }, + * // { "bottom", "com.arsdigita.x.y.z" }, + * // { "right", "com.arsdigita.x.y.z" } + * // } + * // }, + * // { "search", + * // { + * // { "top", "com.arsdigita.x.y.z" }, + * // { "left", "com.arsdigita.x.y.z" }, + * // { "bottom", "com.arsdigita.x.y.z" }, + * // { "right", "com.arsdigita.x.y.z" } + * // } + * // } + * // }; + * */ private final Parameter m_applicationLayouts = new StringArrayParameter( @@ -127,25 +154,45 @@ public class UIConfig extends AbstractConfig { * the default layout for SimplePage class. */ public List getDefaultLayout() { -// String[][] defaultLayoutArray = (String[]) get(m_defaultLayout); - String[][] defaultLayoutArray = - new String[][] - {{ "top","com.arsdigita.ui.UserBanner"} - ,{"bottom","com.arsdigita.ui.SiteBanner"} - ,{"bottom","com.arsdigita.ui.DebugPanel"} - //,{"left","com.arsdigita.x.y.zl"}, - //,{"right","com.arsdigita.x.y.zr"}, - }; - return Arrays.asList(defaultLayoutArray); + + /** List contain the default layout used to create a SimplePage. */ + ArrayList defaultLayout = new ArrayList(); + /** Value of the defaultLayout parameter, a string array of + pair of position:class strings */ + String[] layoutParameter = (String[]) get(m_defaultLayout) ; + + for (int i = 0; i < layoutParameter.length ; ++i) { + String[] layoutSection = StringUtils.split(layoutParameter[i],':'); + defaultLayout.add(Arrays.asList(layoutSection)); + } + return defaultLayout; } /** - * Retrieve the set of default page component objects defining - * the default layout for SimplePage class. + * Retrieve the set of customized layout for applications using the + * SimplePage class. + * Parameter is optional, method may return null! */ public List getApplicationLayouts() { - String[] layouts = (String[]) get(m_applicationLayouts); - return Arrays.asList(layouts); + + /** Value of the customLayout parameter, a string array of + pair of position:class strings */ + String[] customParameter = (String[]) get(m_applicationLayouts) ; + + if (customParameter != null) { + // This part of method could NOT be tested yet! + /** List contain the application layout used to create a SimplePage. */ + ArrayList customLayout = new ArrayList(); + for (int i = 0; i < customParameter.length ; ++i) { + String[] layoutSection = StringUtils.split(customParameter[i],':'); + customLayout.add(Arrays.asList(layoutSection)); + } + return customLayout; + } else { + + return null; + + } } }