Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

This commit was manufactured by cvs2svn to create tag

'rel-2-5-1-RC1'.

git-svn-id: https://source.jasig.org/uPortal/tags/rel-2-5-1-RC1@10670 f5dbab47-78f9-eb45-b975-e544023573eb
  • Loading branch information...
commit 531dbfd633c97d7eb119353af19c556aa1dab303 1 parent 057b647
infrastructure@lists.ja-sig.org authored
Showing with 5,639 additions and 4,935 deletions.
  1. +3 −3 README
  2. +11 −1 build.properties
  3. +1 −1  build.xml
  4. +55 −0 etc/uportal-quickstart-dist.sh
  5. +64 −0 etc/uportal-source-dist.sh
  6. BIN  lib/backport-util-concurrent.jar
  7. BIN  lib/portlets/RenderCountPortlet.war
  8. +22 −0 properties/al/fragments.xml
  9. +11 −1 properties/applicationContext.xml
  10. +1 −0  properties/beanRefFactory.xml
  11. +48 −0 properties/chanpub/render-count-portlet.xml
  12. +33 −0 properties/chanpub/timetitle.xml
  13. +4 −4 properties/db/data.xml
  14. +15 −3 properties/personDirectory.xml
  15. +83 −0 properties/statsContext.xml
  16. +32 −291 releaseNotes.txt
  17. +0 −119 scripts/createTables-hypersonic.script
  18. +0 −15 scripts/dropTables.script
  19. +0 −269 scripts/populateTables.script
  20. +7 −0 source/org/jasig/portal/ChannelIncorporationFilter.java
  21. +93 −20 source/org/jasig/portal/ChannelManager.java
  22. +144 −27 source/org/jasig/portal/ChannelRenderer.java
  23. +6 −6 source/org/jasig/portal/ChannelRendererFactory.java
  24. +23 −1 source/org/jasig/portal/ChannelRuntimeData.java
  25. +51 −5 source/org/jasig/portal/ChannelRuntimeProperties.java
  26. +250 −61 source/org/jasig/portal/CharacterCachingChannelIncorporationFilter.java
  27. +1 −1  source/org/jasig/portal/DownloadDispatchWorker.java
  28. +1 −5 source/org/jasig/portal/GuestUserPreferencesManager.java
  29. +4 −1 source/org/jasig/portal/HttpProxyServlet.java
  30. +4 −1 source/org/jasig/portal/IChannel.java
  31. +25 −2 source/org/jasig/portal/MediaManager.java
  32. +0 −7 source/org/jasig/portal/PortalSessionManager.java
  33. +11 −5 source/org/jasig/portal/RDBMPortletPreferencesStore.java
  34. +73 −55 source/org/jasig/portal/RDBMServices.java
  35. +1 −3 source/org/jasig/portal/StandaloneChannelRenderer.java
  36. +28 −3 source/org/jasig/portal/StructureStylesheetUserPreferences.java
  37. +14 −1 source/org/jasig/portal/StylesheetUserPreferences.java
  38. +11 −0 source/org/jasig/portal/ThemeStylesheetUserPreferences.java
  39. +33 −31 source/org/jasig/portal/UserInstance.java
  40. +64 −2 source/org/jasig/portal/UserInstanceManager.java
  41. +7 −4 source/org/jasig/portal/UserPreferences.java
  42. +23 −80 source/org/jasig/portal/UserPreferencesManager.java
  43. +12 −1 source/org/jasig/portal/UserProfile.java
  44. +2 −2 source/org/jasig/portal/Version.java
  45. +1 −1  source/org/jasig/portal/car/ChannelDefinitionTagHandler.java
  46. +6 −6 source/org/jasig/portal/channels/CNumberGuess.java
  47. +101 −0 source/org/jasig/portal/channels/CTimeTitle.java
  48. +5 −1 source/org/jasig/portal/channels/DLMUserPreferences/TabColumnPrefsState.java
  49. +1 −1  source/org/jasig/portal/channels/cusermanager/CUserManager.java
  50. +7 −7 source/org/jasig/portal/channels/cusermanager/Constants.java
  51. +10 −10 source/org/jasig/portal/channels/cusermanager/provider/DefaultDataHandlerImpl.java
  52. +7 −7 source/org/jasig/portal/channels/error/CError.java
  53. +151 −121 source/org/jasig/portal/channels/portlet/CPortletAdapter.java
  54. +0 −3  source/org/jasig/portal/channels/portlet/ChannelData.java
  55. +41 −0 source/org/jasig/portal/channels/support/IChannelTitle.java
  56. +38 −0 source/org/jasig/portal/channels/support/IDynamicChannelTitleRenderer.java
  57. +44 −0 source/org/jasig/portal/channels/support/TitledChannelRuntimeProperties.java
  58. +11 −2 source/org/jasig/portal/channels/webproxy/CWebProxy.java
  59. +18 −1 source/org/jasig/portal/concurrency/caching/ReferenceEntityCache.java
  60. +25 −13 source/org/jasig/portal/concurrency/caching/ReferenceInvalidatingEntityCache.java
  61. +7 −3 source/org/jasig/portal/container/deploy/Deployer.java
  62. +4 −0 source/org/jasig/portal/container/om/entity/PortletEntityImpl.java
  63. +396 −364 source/org/jasig/portal/container/services/information/PortletStateManager.java
  64. +194 −0 source/org/jasig/portal/container/services/information/PortletWindowStateInfo.java
  65. +15 −2 source/org/jasig/portal/container/services/information/StaticInformationProviderImpl.java
  66. +13 −1 source/org/jasig/portal/container/services/property/PropertyManagerServiceImpl.java
  67. +87 −0 source/org/jasig/portal/container/servlet/PortletAttributeRequestWrapper.java
  68. +1 −1  source/org/jasig/portal/groups/PersonDirNameFinder.java
  69. +4 −3 source/org/jasig/portal/i18n/LocaleManager.java
  70. +5 −1 source/org/jasig/portal/jndi/JNDIManager.java
  71. +1 −1  source/org/jasig/portal/lang/Resources.java
  72. +8 −8 source/org/jasig/portal/lang/StackTrace.java
  73. +1 −1  source/org/jasig/portal/lang/ThrowableHelper.java
  74. +10 −5 source/org/jasig/portal/layout/alm/ALNode.java
  75. +67 −18 source/org/jasig/portal/layout/alm/AggregatedLayout.java
  76. +17 −1 source/org/jasig/portal/layout/alm/AggregatedLayoutManager.java
  77. +634 −321 source/org/jasig/portal/layout/alm/AggregatedUserLayoutStore.java
  78. +0 −2  source/org/jasig/portal/layout/dlm/ConfigurationLoader.java
  79. +0 −52 source/org/jasig/portal/layout/dlm/DistributedLayoutManager.java
  80. +40 −0 source/org/jasig/portal/layout/dlm/DistributedUserPreferences.java
  81. +0 −1  source/org/jasig/portal/layout/dlm/HandlerUtils.java
  82. +0 −3  source/org/jasig/portal/layout/dlm/ILFBuilder.java
  83. +0 −1  source/org/jasig/portal/layout/dlm/PLFIntegrator.java
  84. +18 −25 source/org/jasig/portal/layout/dlm/RDBMDistributedLayoutStore.java
  85. +0 −1  source/org/jasig/portal/layout/dlm/channels/guide/DlmIntroChannel.java
  86. +3 −0  source/org/jasig/portal/layout/node/UserLayoutChannelDescription.java
  87. +4 −0 source/org/jasig/portal/layout/node/UserLayoutNodeDescription.java
  88. +11 −8 source/org/jasig/portal/layout/restrictions/UserLayoutRestriction.java
  89. +5 −1 source/org/jasig/portal/layout/restrictions/alm/DepthRestriction.java
  90. +7 −5 source/org/jasig/portal/layout/simple/RDBMUserLayoutStore.java
  91. +1 −1  source/org/jasig/portal/rdbm/DatabaseMetaDataImpl.java
  92. +41 −5 source/org/jasig/portal/security/provider/RemoteUserPersonManager.java
  93. +9 −0 source/org/jasig/portal/security/provider/RemoteUserSecurityContext.java
  94. +4 −4 source/org/jasig/portal/serialize/BaseMarkupSerializer.java
  95. +21 −0 source/org/jasig/portal/serialize/CachingHTMLSerializer.java
  96. +22 −0 source/org/jasig/portal/serialize/CachingXHTMLSerializer.java
  97. +61 −79 source/org/jasig/portal/serialize/HTMLdtd.java
  98. +4 −34 source/org/jasig/portal/serialize/ProxyWriter.java
  99. +15 −7 source/org/jasig/portal/services/Authentication.java
  100. +156 −183 source/org/jasig/portal/services/StatsRecorder.java
  101. +1 −1  source/org/jasig/portal/services/persondir/support/legacy/PersonDirInfoAdaptor.java
  102. +5 −0 source/org/jasig/portal/services/stats/BaseStatsRecorder.java
  103. +281 −0 source/org/jasig/portal/services/stats/ConditionalStatsRecorder.java
  104. +1 −0  source/org/jasig/portal/services/stats/DoNothingStatsRecorder.java
  105. +8 −1 source/org/jasig/portal/services/stats/IStatsRecorderFactory.java
  106. +122 −0 source/org/jasig/portal/services/stats/IStatsRecorderFlags.java
  107. +120 −0 source/org/jasig/portal/services/stats/LegacyStatsRecorderFactory.java
  108. +475 −0 source/org/jasig/portal/services/stats/ListStatsRecorder.java
  109. +96 −0 source/org/jasig/portal/services/stats/SettingsBackedStatsRecorderFlagsImpl.java
  110. +341 −0 source/org/jasig/portal/services/stats/StatsRecorderFlagsImpl.java
  111. +29 −22 source/org/jasig/portal/services/stats/StatsRecorderSettings.java
  112. +200 −0 source/org/jasig/portal/services/stats/ThreadFiringStatsRecorder.java
  113. +9 −18 source/org/jasig/portal/tools/ChannelServlet.java
  114. +94 −43 source/org/jasig/portal/tools/checks/ChecksServlet.java
  115. +9 −1 source/org/jasig/portal/tools/dbloader/DbUnload.java
  116. +1 −1  source/org/jasig/portal/utils/SAX2BufferImpl.java
  117. +9 −0 source/org/jasig/portal/utils/SAX2DuplicatingFilterImpl.java
  118. +4 −0 source/org/jasig/portal/utils/SAX2FilterImpl.java
  119. +4 −3 source/org/jasig/portal/utils/SoftHashMap.java
  120. +24 −33 source/org/jasig/portal/utils/SqlTransaction.java
  121. +27 −10 source/org/jasig/portal/utils/SubstitutionIntegerFilter.java
  122. +10 −6 source/org/jasig/portal/utils/SubstitutionServletOutputStream.java
  123. +7 −4 source/org/jasig/portal/utils/SubstitutionWriter.java
  124. +1 −0  source/org/jasig/portal/utils/threading/PriorityThreadFactory.java
  125. +54 −0 tests/org/jasig/portal/container/services/information/StaticInformationProviderImplTest.java
  126. +7 −7 tests/org/jasig/portal/lang/ChainedThrowable_Test.java
  127. +1 −1  tests/org/jasig/portal/lang/Resources_Test.java
  128. +4 −4 webpages/dtd/channelPublishingDocument.dtd
  129. +3 −31 webpages/error.jsp
  130. +3 −31 webpages/index.jsp
  131. BIN  webpages/media/org/jasig/portal/channels/CError/error_hide_trace.gif
  132. BIN  webpages/media/org/jasig/portal/channels/CError/error_reboot.gif
  133. BIN  webpages/media/org/jasig/portal/channels/CError/error_refresh.gif
  134. BIN  webpages/media/org/jasig/portal/channels/CError/error_show_trace.gif
  135. BIN  webpages/media/org/jasig/portal/channels/CError/transparent.gif
  136. BIN  webpages/media/org/jasig/portal/channels/CError/wrenchworks.gif
  137. +8 −5 webpages/media/org/jasig/portal/channels/webproxy/CWebProxy.cpd
  138. +0 −6 webpages/media/org/jasig/portal/layout/AL_TabColumn/integratedModes/cartoon/CVS/Entries
  139. +0 −1  webpages/media/org/jasig/portal/layout/AL_TabColumn/integratedModes/cartoon/CVS/Repository
  140. +0 −1  webpages/media/org/jasig/portal/layout/AL_TabColumn/integratedModes/cartoon/CVS/Root
  141. +0 −1  webpages/stylesheets/org/jasig/portal/channels/CChannelManager/html_en_US.xsl
  142. +0 −14 webpages/stylesheets/org/jasig/portal/channels/CError/CError.ssl
  143. +0 −56 webpages/stylesheets/org/jasig/portal/channels/CError/html_friendly.xsl
  144. +0 −13 webpages/stylesheets/org/jasig/portal/channels/CError/html_friendly.xsl.de_DE.dict
  145. +0 −13 webpages/stylesheets/org/jasig/portal/channels/CError/html_friendly.xsl.en_US.dict
  146. +0 −13 webpages/stylesheets/org/jasig/portal/channels/CError/html_friendly.xsl.it_IT.dict
  147. +0 −13 webpages/stylesheets/org/jasig/portal/channels/CError/html_friendly.xsl.ja_JP.dict
  148. +0 −13 webpages/stylesheets/org/jasig/portal/channels/CError/html_friendly.xsl.sv_SE.dict
  149. +0 −56 webpages/stylesheets/org/jasig/portal/channels/CError/html_friendly_de_DE.xsl
  150. +0 −56 webpages/stylesheets/org/jasig/portal/channels/CError/html_friendly_en_US.xsl
  151. +0 −56 webpages/stylesheets/org/jasig/portal/channels/CError/html_friendly_it_IT.xsl
  152. +0 −56 webpages/stylesheets/org/jasig/portal/channels/CError/html_friendly_ja_JP.xsl
  153. +0 −56 webpages/stylesheets/org/jasig/portal/channels/CError/html_friendly_lv_LV.xsl
  154. +0 −56 webpages/stylesheets/org/jasig/portal/channels/CError/html_friendly_sv_SE.xsl
  155. +0 −222 webpages/stylesheets/org/jasig/portal/channels/CError/html_full.xsl
  156. +0 −33 webpages/stylesheets/org/jasig/portal/channels/CError/html_full.xsl.de_DE.dict
  157. +0 −33 webpages/stylesheets/org/jasig/portal/channels/CError/html_full.xsl.en_US.dict
  158. +0 −33 webpages/stylesheets/org/jasig/portal/channels/CError/html_full.xsl.it_IT.dict
  159. +0 −33 webpages/stylesheets/org/jasig/portal/channels/CError/html_full.xsl.ja_JP.dict
  160. +0 −33 webpages/stylesheets/org/jasig/portal/channels/CError/html_full.xsl.sv_SE.dict
  161. +0 −222 webpages/stylesheets/org/jasig/portal/channels/CError/html_full_de_DE.xsl
  162. +0 −222 webpages/stylesheets/org/jasig/portal/channels/CError/html_full_en_US.xsl
  163. +0 −222 webpages/stylesheets/org/jasig/portal/channels/CError/html_full_it_IT.xsl
  164. +0 −222 webpages/stylesheets/org/jasig/portal/channels/CError/html_full_ja_JP.xsl
  165. +0 −222 webpages/stylesheets/org/jasig/portal/channels/CError/html_full_lv_LV.xsl
  166. +0 −222 webpages/stylesheets/org/jasig/portal/channels/CError/html_full_sv_SE.xsl
  167. +0 −148 webpages/stylesheets/org/jasig/portal/channels/CError/wml.xsl
  168. +17 −17 webpages/stylesheets/org/jasig/portal/channels/CSnoop/CSnoop.xsl
  169. +21 −0 webpages/stylesheets/org/jasig/portal/channels/CTimeTitle/CTimeTitle.xsl
  170. +18 −1 webpages/stylesheets/org/jasig/portal/layout/AL_TabColumn/integratedModes/integratedModes.xsl
  171. +2 −2 webpages/stylesheets/org/jasig/portal/layout/DLM-tab-column/nested-tables/nested-tables.xsl
View
6 README
@@ -14,13 +14,13 @@ clean build directories and publish the uPortal build into a configured Tomcat i
accidentally run the build such that it overwrites a uPortal instance you care about. Locations affected by
the build are declared in build.properties.
-
+Backup your work before running builds.
Manifest
----------------------------------------
build.properties o Contains configuration for the build file that needs to
be customized for your environment.
-build.xml o Contains the ant build targets for working with uPortal.
+build.xml o Contains the Ant build targets for working with uPortal.
Ant Depdency
----------------------------------------
@@ -62,7 +62,7 @@ version of the portal is configured.
Logging
---------------------------------------
-The ant build moves /properties/Logger.properties to the root of the classes directory so that the resulting
+The ant build copies /properties/Logger.properties to the root of the classes directory so that the resulting
log4j.properties file will be available on the classpath for Commons Logging / log4j to find. You'll need to either
change that configuration in Logger.properties before the build or to change it in /WEB-INF/classes/ afterwards.
You can configure the logging level, where the file should be, or even choose a different logging approach (log
View
12 build.properties
@@ -15,7 +15,7 @@
#==================== File and Directory Names ========================
app.name=uPortal
-app.version=2.5.0-RC3
+app.version=2.5.1_RC1
lib.path=lib
server.home=/JavaClasses/jakarta-tomcat-5.0.28
@@ -35,6 +35,16 @@ deploy.home=${server.home}/webapps/${webapp.docBase}
webapp.contextFile=uPortal.xml
# prototype context file for use with Tomcat 5.5
+#
+# Note that if you use this context file to declare one or more DataSources you would like
+# the Tomcat 5.5 servlet container to instantiate and make available to uPortal via JNDI,
+# you also need to make the .jar files implementing those datasources available to
+# Tomcat 5.5 by installing them into the /common/lib directory of your Tomcat 5.5 instance.
+# Without the required .jar(s), Tomcat will be unable to instantiate the DataSource.
+#
+# The build.xml build process does not currently install the database driver jar
+# (Declared as jdbcDriver.jar below) into Tomcat 5.5 /common/lib. You will need to do this manually.
+#
#webapp.contextFile=uPortal55.xml
#==================== Compilation Control Options =====================
View
2  build.xml
@@ -1346,7 +1346,7 @@
<target name="pubchan" description="Publishes channels" depends="compile">
<echo message="Invoking Channel Publisher Tool"/>
- <property name="channel" value=" "/>
+ <property name="channel" value="all"/>
<java fork="true" failonerror="true" dir="${basedir}" classname="org.jasig.portal.tools.chanpub.ChannelPublisher">
<classpath>
<pathelement path="${build.home}/WEB-INF/classes"/>
View
55 etc/uportal-quickstart-dist.sh
@@ -0,0 +1,55 @@
+#!/bin/bash
+#
+# $Id$
+# This script will package up a uPortal quickstart distribution
+#
+
+if [ -z "$3" ]; then
+ echo usage: $0 release-tag uportal-src-dir old-quickstart-dir
+ exit
+fi
+
+RELEASE=uPortal_$1-quick-start
+SRC=$2
+QSDIR=$3
+
+#
+# Create root dir for quick-start distribution
+#
+echo $RELEASE
+mkdir $RELEASE
+cd $RELEASE
+
+#
+# Move in uPortal source distribution and quickstart scripts
+#
+#
+cp -r $SRC .
+cp $SRC/etc/quickstart/* .
+
+#
+# Move in quickstart resources from previously release
+# (is there a better way to do a quickstart?)
+#
+cp -r $QSDIR/Ant_1-6-2 .
+cp -r $QSDIR/HSQLDB_1-7-2-4 .
+cp -r $QSDIR/Tomcat_5-0-28 .
+
+
+echo "done!"
+echo "Now..."
+echo "update server.home in uPortal build.properties"
+echo "start hsqldb - ant hsql"
+echo "set getDatasourceFromJNDI in portal.properties to true
+echo "run ant deploy in uPortal home"
+echo "start tomcat, ant tomcatstart, and check for no errors in portal.log"
+echo "stop HSQL and Tomcat"
+echo "rm uPortal/build, and Tomcat work and logs, and portal.log"
+echo "run fix-unix-modes.sh"
+echo "zip -r uPortal_X-X-X-quick-start uPortal_X-X-X-quick-start"
+echo ""
+echo "scp the release to www.jasig.org:/var/www/html/ja-sig/uportaldist"
+echo "update download.html page."
+echo "update cvs.html page."
+echo "update index.html with news about releases."
+exit
View
64 etc/uportal-source-dist.sh
@@ -0,0 +1,64 @@
+#!/bin/bash
+
+#
+# $Id$
+# This script will package up a uPortal source distribution
+#
+
+
+if [ -z "$1" ]; then
+ echo usage: $0 release-tag
+ exit
+fi
+
+#
+# Export release tag
+#
+cvs -d:pserver:anonymous@mis105.mis.udel.edu:/home/cvs/jasig login
+cvs -d:pserver:anonymous@mis105.mis.udel.edu:/home/cvs/jasig export -r $1 portal
+
+#
+# Remove website directory, build.xml and README in ./docs
+# These are used to maintain the website and are not
+# needed in the distribution. Is there a better place for these?
+#
+rm -rf ./portal/docs/website
+rm ./portal/docs/build.xml
+rm ./portal/docs/README
+
+#
+# Remove .cvsignore files.
+#
+find . -name ".cvsignore" | xargs rm
+
+#
+# Remove .dict files. (should these be moved to the attic?)
+#
+find . -name "*.dict" | xargs rm
+
+#
+# Create JavaDoc
+#
+cd portal
+ant javadoc
+mv ./dist/docs/api ./docs/
+ant clean
+cd ../
+
+#
+# Rename model to uPortal_{release-tag}
+#
+mv portal uPortal_$1
+
+#
+# Zip up distribution
+#
+zip -r uPortal_$1 uPortal_$1
+
+echo "done!"
+echo "Now..."
+echo "scp the release to www.jasig.org:/var/www/html/ja-sig/uportaldist"
+echo "update download.html page."
+echo "update cvs.html page."
+echo "update index.html with news about releases."
+exit
View
BIN  lib/backport-util-concurrent.jar
Binary file not shown
View
BIN  lib/portlets/RenderCountPortlet.war
Binary file not shown
View
22 properties/al/fragments.xml
@@ -110,16 +110,38 @@
<channel fname="missing-properties" immutable="Y" unremovable="Y" hidden="N"/>
<channel fname="person-attributes" immutable="Y" unremovable="Y" hidden="N"/>
<channel fname="css-viewer" immutable="Y" unremovable="Y" hidden="N"/>
+
</folder>
<folder name="column2" immutable="Y" unremovable="Y" hidden="N">
<channel fname="snooper" immutable="Y" unremovable="Y" hidden="N"/>
<channel fname="uportal-development-books" immutable="Y" unremovable="Y" hidden="N"/>
<channel fname="uportal-data-dictionary" immutable="Y" unremovable="Y" hidden="N"/>
<channel fname="uportal-developers-reference" immutable="Y" unremovable="Y" hidden="N"/>
+
</folder>
</folder>
</fragment>
+ <fragment name="dynamicTitles" type="pushed">
+ <description>Demonstrates dynamic title feature.</description>
+ <groups>
+ <group>Everyone</group>
+ <group>Guests</group>
+ </groups>
+ <restrictions>
+ <restriction path="local" name="priority" value="1000-2000"/>
+ <restriction path="local" name="depth" value="1"/>
+ </restrictions>
+ <folder name="Dynamic Titles" immutable="Y" unremovable="Y" hidden="N">
+ <folder name="column1" immutable="Y" unremovable="Y" hidden="N">
+ <channel fname="timetitle" immutable="Y" unremovable="Y" hidden="N"/>
+ </folder>
+ <folder name="column2" immutable="Y" unremovable="Y" hidden="N">
+ <channel fname="render-count-portlet" immutable="Y" unremovable="Y" hidden="N"/>
+ </folder>
+ </folder>
+ </fragment>
+
<fragment name="Portlet-examples" type="pushed">
<description>Channels that demonstrate the portlet adapter</description>
<groups>
View
12 properties/applicationContext.xml
@@ -11,8 +11,18 @@
| Here we define additional startup checks. These are in addition to hard-coded checks that
| are intended to detect problems that would prevent us from reading in and using these
| configurable checks.
+ |
+ | This bean is lazy-init so that it will not be instantiated by Spring
+ | unless actually needed. This reduces the chance that a broken checks
+ | configuration, or one that depends on resources that are unavailable
+ | (such as JNDI resources outside the context of a JNDI container)
+ | will not break the use of a uPortal administrative tool / break a
+ | uPortal deployment.
+ |
+-->
- <bean id='checkRunner' class="org.jasig.portal.tools.checks.BasicCheckRunner">
+ <bean id='checkRunner'
+ class="org.jasig.portal.tools.checks.BasicCheckRunner"
+ lazy-init="true">
<property name="checks">
<list>
View
1  properties/beanRefFactory.xml
@@ -22,6 +22,7 @@
<value>properties/applicationContext.xml</value>
<value>properties/cacheContext.xml</value>
<!--
+ <value>properties/statsContext.xml</value>
<value>properties/jmxContext.xml</value>
-->
</list>
View
48 properties/chanpub/render-count-portlet.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!DOCTYPE channel-definition SYSTEM "channelDefinition.dtd">
+
+<!--
+ | This channel publishing fragment defines a channel for the
+ | Render Count portlet, an example JSR-168 that exercises the
+ | dynamic portlet title feature.
+ +-->
+
+<channel-definition>
+
+ <title>Render Count Portlet</title>
+ <name>Render Count Portlet</name>
+ <fname>render-count-portlet</fname>
+ <desc>Demonstrates dynamic portlet titles.</desc>
+ <type>Portlet</type>
+ <class>org.jasig.portal.channels.portlet.CPortletAdapter</class>
+ <timeout>60000</timeout>
+
+ <hasedit>N</hasedit>
+ <hashelp>N</hashelp>
+ <hasabout>N</hasabout>
+
+ <secure>N</secure>
+ <locale>en_US</locale>
+
+ <categories>
+ <category>Development</category>
+ </categories>
+
+ <groups>
+ <group>Everyone</group>
+ </groups>
+
+ <parameters>
+
+ <!-- The syntax of the ID is [portlet-context-name].[portlet-name] -->
+ <parameter>
+ <name>portletDefinitionId</name>
+ <value>RenderCountPortlet.RenderCount</value>
+ <description>Identifies the portlet deployed within the portlet container</description>
+ <ovrd>N</ovrd>
+ </parameter>
+
+ </parameters>
+
+</channel-definition>
View
33 properties/chanpub/timetitle.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!DOCTYPE channel-definition SYSTEM "channelDefinition.dtd">
+
+<channel-definition>
+
+ <title>Dynamic Time Channel Title</title>
+ <name>Dynamic Time Channel Title</name>
+ <fname>timetitle</fname>
+ <desc>Channel for testing support for dynamic channel titles.</desc>
+ <type>Custom</type>
+ <class>org.jasig.portal.channels.CTimeTitle</class>
+ <timeout>5000</timeout>
+
+ <hasedit>N</hasedit>
+ <hashelp>N</hashelp>
+ <hasabout>N</hasabout>
+
+ <secure>N</secure>
+ <locale>en_US</locale>
+
+ <categories>
+ <category>Development</category>
+ </categories>
+
+ <groups>
+ <group>Everyone</group>
+ <group>Guests</group>
+ </groups>
+
+ <parameters/>
+
+</channel-definition>
View
8 properties/db/data.xml
@@ -10,7 +10,7 @@
<column><name>FNAME</name><value>UP_FRAMEWORK</value></column>
<column><name>MAJOR</name><value>2</value></column>
<column><name>MINOR</name><value>5</value></column>
- <column><name>MICRO</name><value>0</value></column>
+ <column><name>MICRO</name><value>1</value></column>
<column><name>DESCRIPTION</name><value>The uPortal Framework.</value></column>
</row>
</rows>
@@ -1104,7 +1104,7 @@
<column><name>CHAN_TITLE</name><value>Session Locale Selector</value></column>
<column><name>CHAN_NAME</name><value>Session Locale Selector</value></column>
<column><name>CHAN_DESC</name><value>A tool for selecting a locale</value></column>
- <column><name>CHAN_CLASS</name><value>org.jasig.portal.channels.layout.locales.CSessionLocalesSelector</value></column>
+ <column><name>CHAN_CLASS</name><value>org.jasig.portal.layout.channels.locales.CSessionLocalesSelector</value></column>
<column><name>CHAN_TYPE_ID</name><value>-1</value></column>
<column><name>CHAN_PUBL_ID</name><value>0</value></column>
<column><name>CHAN_PUBL_DT</name><value>SYSDATE</value></column>
@@ -3853,8 +3853,8 @@
<column><name>PROFILE_NAME</name><value>HTML browser profile</value></column>
<column><name>DESCRIPTION</name><value>A sample profile for common web browsers</value></column>
<column><name>LAYOUT_ID</name><value>1</value></column>
- <column><name>STRUCTURE_SS_ID</name>4</column>
- <column><name>THEME_SS_ID</name>3</column>
+ <column><name>STRUCTURE_SS_ID</name><value>4</value></column>
+ <column><name>THEME_SS_ID</name><value>3</value></column>
</row>
</rows>
</table>
View
18 properties/personDirectory.xml
@@ -60,9 +60,21 @@
PersonDirectory acquires when it asks for the bean of that name.
-->
- <!-- Legacy Person Directory configruation. This will read the config from PersonDirs.xml
- and otherwise emulate pre-2.5 PersonDirectory behavior. -->
- <bean id="personAttributeDao" class="org.jasig.portal.services.persondir.support.legacy.LegacyPersonAttributeDao"/>
+ <!--
+ | Legacy Person Directory configruation. This will read the config from PersonDirs.xml
+ | and otherwise emulate pre-2.5 PersonDirectory behavior.
+ |
+ | This bean is marked lazy-init="true" so that Spring will not eagerly
+ | initialize this bean when the PortalApplicationContextFacade is touched.
+ | This avoids unnecessarily building the instantiating the PersonAttributeDao i
+ | mplementation where it is not being used and where it may not have the
+ | resources it needs to be used, e.g. when running outside the context of
+ | a JNDI container.
+ |
+ +-->
+ <bean id="personAttributeDao"
+ class="org.jasig.portal.services.persondir.support.legacy.LegacyPersonAttributeDao"
+ lazy-init="true" />
<!--
| Example Person Directory configuration using the Spring implementation,
View
83 properties/statsContext.xml
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
+<beans>
+<!--
+ | The parent bean is the Conditional wrapper because first we want to filter down to
+ | the events we're actually going to log.
+ +-->
+ <bean name="statsRecorder"
+ class="org.jasig.portal.services.stats.ConditionalStatsRecorder">
+ <property name="flags">
+ <!--
+ | This JavaBean lets us configure which events we'd like the Conditional
+ | wrapper to propogate. The flags default to false so we need only declared those
+ | methods we would like to propogate.
+ +-->
+ <bean class="org.jasig.portal.services.stats.StatsRecorderFlagsImpl">
+ <property name="recordLogin" value="true"/>
+ <property name="recordLogout" value="true"/>
+ <property name="recordSessionCreated" value="true"/>
+ <property name="recordSessionDestroyed" value="true"/>
+ <property name="recordChannelDefinitionPublished" value="true"/>
+ <property name="recordChannelDefinitionModified" value="true"/>
+ <property name="recordChannelDefinitionRemoved" value="true"/>
+ <property name="recordChannelAddedToLayout" value="true"/>
+ <property name="recordChannelUpdatedInLayout" value="true"/>
+ <property name="recordChannelMovedInLayout" value="true"/>
+ <property name="recordChannelRemovedFromLayout" value="true"/>
+ <property name="recordFolderAddedToLayout" value="true"/>
+ <property name="recordFolderUpdatedInLayout" value="true"/>
+ <property name="recordFolderMovedInLayout" value="true"/>
+ <property name="recordFolderRemovedFromLayout" value="true"/>
+
+ <property name="recordChannelInstantiated" value="false"/>
+ <property name="recordChannelRendered" value="false"/>
+ <property name="recordChannelTargeted" value="false"/>
+ </bean>
+ </property>
+
+ <!--
+ | The Conditional stats recorder will call this target when its condition is fulfilled, that is
+ | when the method call is recordChannelRendered(). IStatsRecorder calls other than
+ | recordChannelRendered will have no effect, that is, are filtered away
+ | by the Conditional stats recorder.
+ +-->
+ <property name="targetStatsRecorder">
+ <!--
+ | The target of the Conditional is the thread firing wrapper so that we'll use separate
+ | threads to perform the actual logging.
+ +-->
+ <bean class="org.jasig.portal.services.stats.ThreadFiringStatsRecorder">
+ <!-- initial thread pool size -->
+ <constructor-arg value="5"/>
+ <!-- maximum thread pool size -->
+ <constructor-arg value="15"/>
+ <!-- thread priority -->
+ <constructor-arg value="5"/>
+
+ <!--
+ | The target of the threads we fire is this LoggingStatsRecorder instance.
+ +-->
+ <property name="targetStatsRecorder">
+ <bean class="org.jasig.portal.services.stats.LoggingStatsRecorder"/>
+ </property>
+ <!--
+ | Below is an example of using listStatsRecorder to log to more than one IStatsRecorder.
+ +-->
+ <!--
+ <property name="targetStatsRecorder">
+ <bean class="org.jasig.portal.services.stats.ListStatsRecorder">
+ <property name="children">
+ <list>
+ <bean class="org.jasig.portal.services.stats.LoggingStatsRecorder"/>
+ <bean class="edu.cornell.uportal.channels.runtimeinfo.providers.Statistics"/>
+ </list>
+ </property>
+ </bean>
+ </property>
+ -->
+ </bean>
+ </property>
+ </bean>
+</beans>
+
View
323 releaseNotes.txt
@@ -2,327 +2,68 @@ This is a file for notes specific to the uPortal release that the code you're lo
either is (in the case of a tagged release) or will become (in the case of the tip of a patches or main branch).
-Release notes for uPortal 2.5.0 RC 3:
-
-
-
-This is the third and likely final uPortal 2.5.0 Release Candidate.
-
+Release notes for uPortal 2.5.1 RC1 (release candidate):
Known issues
-
-There are many known bugs in this release. You can query our JIRA system for known issues affecting this release, including
-issues discovered after this release went to press.
+There are many known bugs in uPortal. We expect there are many fewer of them in this release than in 2.5.0.
+You can query our JIRA system for known issues affecting this release, including
+issues discovered after this release was cut.
http://jasigch.princeton.edu:9000/jira/
Search for issues with a "Matches Versions" of this release.
-This release includes several improvements and fixes beyond 2.5.0 RC 2, which in turn included many
-changes beyond 2.5.0 RC 1, and 2.5.0 M1.
-
-Here are links to dynamic issue information. At the end of this file is a snapshot of the change log.
-
-You can ask our JIRA issue tracking sytem to generate notes for this release:
-
-http://jasigch.princeton.edu:9000/jira/secure/IssueNavigator.jspa?reset=true&pid=10020&fixfor=10141
+Upgrading:
-You can ask our JIRA issue tracking system to generate notes for the 2.5.0 RC 2 release upon which this release builds:
+While your current channels and theme transforms will work unchanged in uPortal 2.5.1 if they worked in 2.5.0,
+transforms require minor changes and channels potentially major changes to take advantage of dynamic
+channel titles. CTimeTitle and the changes to the ALM / Integration Modes theme transform provide an example.
-http://jasigch.princeton.edu:9000/jira/secure/ReleaseNote.jspa?projectId=10020&styleName=Html&version=10142
+RDBMServices changed to stop declaring some SQLExceptions it would never throw. Code catching those exceptions
+will no longer compile (compile will fail with an unreachable catch block error). Fixing this is trivial:
+remove the unreachable catch blocks.
-and for the 2.5.0 RC1 release upon which this release builds, here:
-http://jasigch.princeton.edu:9000/jira/secure/ReleaseNote.jspa?projectId=10020&styleName=Html&version=10140
-and for the 2.5.0 M1 release upon which the 2.5.0 RC1 release builds, here:
+Major new features and improvements in this release:
-http://jasigch.princeton.edu:9000/jira/secure/ReleaseNote.jspa?projectId=10020&styleName=Html&version=10096
+Dynamic channel titles: now channels can specify at runtime their desired title, instead of just using
+a title configured at the time of channel publication. CPortletAdapter needs enhancement to take advantage of this
+feature to present dynamic portlet titles as dynamic channel titles.
+Support for multiple stats recorders.
+Inherent threadsafety of SoftHashMap.
+And many more minor enhancements.
-Please make known any issues you discover with this release.
-The release egineer's system:
+Bug fixes in this release:
-Lynn Hollerman asked that we document what systems a release was tested on. For what it's worth:
-the release engineer (Andrew Petro, Yale) informally tested this release
-before tagging on
-a Windows / Tomcat 5.0.25 / Java 1.4.2_04 with JAXP 1.3 extensions against the default HSQLDB database via
-the clean, runtests, initportal Ant build sequence.
+Reduction of excessive object creation.
+Threadsafety of system cache.
+And many more minor bug fixes.
-The actual release distribution was produced on a Red Hat linux machine using Jdk 1.5.0_02 . (Note: since you'll need to
-build from source for your environment, as the distribution does not contain uPortal .class, .jar, or .war files produced
-by the build, using JDK 1.5 to produce the release should not affect JDK 1.4 compatibility.)
-CHANGE LOG:
-uPortal - Version 2.5.0 RC3
-Bug
- * [UP-1004] - RDBMChannelRegistryStore needs prepared statements
- * [UP-1048] - Locale selector channel not showing for logged in users when using DLM.
- * [UP-1068] - New Fragment Owners don't get the layout of the dlm template user.
- * [UP-1076] - UserLayoutStoreFactory double checked locking
- * [UP-1080] - Portlet redirects leave ChannelManager in inconsistent state
- * [UP-1081] - Double checked locking in PooledDataSourceFactoryFactory
- * [UP-1082] - PooledDataSourceFactoryFactory default broken
- * [UP-1087] - PortletPreferencesStoreFactory double checked locking
- * [UP-1089] - reset of layout does not use new template
- * [UP-1096] - FragmentActivator.bindToOwner() Exception caught needs to be logged at error or warn level
- * [UP-1104] - Two points in XSLT don't include available document location info in exceptions
- * [UP-1113] - ServletRequestImpl is not used during render phase of portlets
- * [UP-1116] - Check for DOM3 remediation advice for JDK 1.5
+Database schema changes
-Task
+There are no database schema changes between uPortal 2.5.0 and uPortal 2.5.1.
- * [UP-1036] - Include Jira-produced and more literate release notes
- * [UP-1078] - update version
+There were minor database schema changes between uPortal 2.4.x and uPortal 2.5.0. These affect Aggregated Layouts.
-Improvement
- * [UP-987] - Make guest layout a fragment in DLM and editable by non-guest, admin user.
- * [UP-1059] - Need DLM Admin page in documentation
- * [UP-1065] - Log info message when layout components loaded
- * [UP-1083] - DBCPDataSourceFactory maintenance
- * [UP-1084] - Specify Map argument to IPersonAttributeDao to be immutable
- * [UP-1093] - Add documentation channel to error handling fragment
- * [UP-1095] - Add JAXP13 sanity check to checks run by CheckingContextListener
- * [UP-1099] - declare @since JavaDoc tag in org.jasig.portal.tools.checks classes
- * [UP-1101] - Note db schema changes in release notes
- * [UP-1103] - Add DOM3 sanity check to checks run by CheckingContextListener
- * [UP-1105] - DLM daemon threads don't have descriptive names.
- * [UP-1117] - Fixed logging of exceptions to include stack trace.
+Discussing this release and reporting issues:
+Please discuss this release on the uPortal project discussion lists. Please post issues discovered into JIRA.
-uPortal - Version 2.5.0 RC2
-Bug
+Release engineer's environment:
- * [UP-198] - HTMLSerializer shorthands all empty HTML elements
- * [UP-769] - Losing Portlet stack traces
- * [UP-882] - "Can Not Start uPortal" message misleading
- * [UP-979] - Case of database column names a problem with MySQL on Unix
- * [UP-985] - DLM code contains references to campus pipeline namespace
- * [UP-1043] - IALChannelDescription JavaDoc comment incorrect
- * [UP-1055] - ALM: unable to subscribe to channels
- * [UP-1058] - Worker.java (in utils.threading) the releaseThread method is *only* called in the try block. This call should be in finally block.
- * [UP-1060] - Fragment restriction changes aren't being persisted for columns.
- * [UP-1061] - Fragment element restrictions are being pushed into regular user's layout.
- * [UP-1062] - If error occurs adding a channel when using DLM no error log entry is created.
- * [UP-1069] - Profile for new users contains null values in up_user_profile which breaks many areas.
- * [UP-1071] - provide helpful error message if JAXP is not installed on JDK 1.4
- * [UP-1072] - remove variables named enum to fix compile on JDK 1.5
- * [UP-1073] - Eliminate use of deprecated constructor of ChannelParameter
-
-Task
-
- * [UP-1035] - Include Jira-produced and more literate release notes
- * [UP-1070] - Remove un necessary classes from org.jasig.portal.utils.threading package.
-
-Improvement
-
- * [UP-625] - direct URL to channel
- * [UP-1075] - upgrade to Spring 1.2 (from 1.1.1)
-
-
-
-uPortal - Version 2.5.0 RC1
-Bug
-
- * [UP-675] - remove call to commit() in DbLoader.process()
- * [UP-762] - anchors should not be set for links that already contain an anchor
- * [UP-862] - BoundedThreadPool infinite loop or deadlock
- * [UP-950] - convert cusermanager to use commons logger and do some minor cleanup
- * [UP-983] - Exception caught and ignored in IPersonEvaluatorFactory.java
- * [UP-984] - should IPersonEvaluatorFactory start with an "I"? It isn't an interface.
- * [UP-990] - build.xml needs to have failonerror true when forking to java
- * [UP-991] - RDBMServices fails to fail over to rdbm.properties when PortalDb not available via JNDI
- * [UP-993] - ChannelPublisher.main() should failfast and communicate failure to ant build
- * [UP-994] - ReferenceEntityCache thread should be set daemon
- * [UP-997] - convert DLM code to use commons logger
- * [UP-999] - No way to communicate desired media base to ChannelRuntimeData
- * [UP-1007] - ant compile target does not copy .cpd file for channel types to WEB-INF/classes area
- * [UP-1008] - ChannelPublisher doesn't use correct class when publishing channel of non custom-java type.
- * [UP-1009] - channel versions are not being removed from UP_VERSIONS when channel definitions are deleted.
- * [UP-1010] - CAR Auto-publishing causes error message on console
- * [UP-1011] - CAR Auto-publishing is throwing a Parse Exception for document type "null"
- * [UP-1012] - CAR Auto-publishing incorrectly handles characters in nested elements
- * [UP-1013] - DLM fragment cleaner thread should be set daemon
- * [UP-1021] - remove MultipartDataSource setFileTypeMap()
- * [UP-1023] - Framed Tab fields showing in create new tab page.
- * [UP-1029] - RDBMDistributedLayoutStore copyright header
- * [UP-1038] - Remove unused class in DLM package.
- * [UP-1041] - NoClassDefFoundError for javax.transaction.Transaction
- * [UP-1050] - eliminate deprecated use of org.jasig.portal.channels.CError in RDBMDistributedLayoutStore
- * [UP-1051] - context.xml created by Ant not discovered by Tomcat
-
-New Feature
-
- * [UP-998] - make CPortletAdapter extensible
- * [UP-1024] - add CAbstractXslt
- * [UP-1042] - HttpProxyServlet should accept a lsit of referers not just one
-
-Task
-
- * [UP-995] - move org.jasig.portal.layout.al out of HEAD and into Sandbox
- * [UP-1034] - Include Jira-produced and more literate release notes
- * [UP-1052] - update the UP version string for 2.5.0 RC1
-
-Improvement
-
- * [UP-879] - Place context file in META-INF
- * [UP-884] - test portlets
- * [UP-885] - @version tags $Revision$ $Date$
- * [UP-912] - Encode portlet params as standard params rather than in uP file
- * [UP-988] - Add a new Component to the uPortal project for Distributed Layout Management.
- * [UP-1001] - Document ChannelRuntimeProperties setWillRender() no effect
- * [UP-1019] - remove MultipartDataSource getFile()
- * [UP-1020] - add ChannelRuntimeData toString()
- * [UP-1022] - repackage BasicLocalConnectionContext to be among providers
- * [UP-1025] - add CMissingProperties
- * [UP-1026] - RDBMUserLayoutStore protected instance logger
- * [UP-1027] - Layout packaging
- * [UP-1028] - extract LayoutStructure and StructureParameter from RDBMUserLayoutStore
- * [UP-1030] - Apply JA-SIG copyright header to DLM code
- * [UP-1031] - DLM type JavaDoc metadata
- * [UP-1032] - MultipartDataSource log on failure to delete temp file
- * [UP-1033] - ChannelFactory use JavaDoc style comments for staticChannels and classLoader
- * [UP-1037] - Document in README how to configure DataSource
- * [UP-1044] - eliminate AllTests
-
-
-
-uPortal - Version 2.5.0 M1
-
-Bug
- * [UP-169] - RDBMPermissibleRegistry not using CarClassLoader
- * [UP-338] - RENDERING_DONE Event never sent
- * [UP-466] - replace alt="interface image" with alt=""
- * [UP-632] - Compilation with JDK1.5.0 fails
- * [UP-656] - add logging message to ChannelManger.replaceWithErrorChannel()
- * [UP-658] - CError should never fail to render
- * [UP-662] - The CContentSubscriber channel caches the channel list
- * [UP-684] - pubfragments fails but overall build succeeds
- * [UP-710] - Pluto-in-uPortal unique name is hardcoded into the CPortletAdapter.java file
- * [UP-750] - ILdapServer.getConnection() hid connection exception
- * [UP-765] - remove unused table UPC_KEYWORD
- * [UP-766] - ActionResponse redirect & setWindowState methods do nothing
- * [UP-773] - ActionResponse.setWindowState(EXCUSIVE) doesn't work
- * [UP-781] - PortletURLs generated in EXCLUSIVE window state are incorrect
- * [UP-782] - Changing PortletMode while in EXCLUSIVE does not work
- * [UP-789] - RenderResponse.getWriter() doesn't work in EXCLUSIVE WindowState
- * [UP-802] - Upgrade/Remove Apache Axis jar to fix reserved word compile error on Jdk 1.5
- * [UP-806] - Eliminate log4j dependency in LoggingStatsRecorder
- * [UP-808] - GuidGenerator default constructor generates last component of guid wrong
- * [UP-817] - CPortletAdapter opaque credentials parser has extra code
- * [UP-831] - Render/Action parameters don't get passed correctly in EXCLUSIVE WindowState
- * [UP-843] - Remove jdbc2_0-stdext.jar now that we require jdk 1.4 and up
- * [UP-844] - Remove jaas.jar now that we require jdk 1.4 and up
- * [UP-866] - set initCause on IOExceptions in PortletEntityImpl
- * [UP-867] - eliminate need for caching Exception in constructor of RDBMChannelDefSearcher and RDBMPersonSearcher
- * [UP-869] - Unecessary Copy of principalCache on newPrincipal creation
- * [UP-871] - RDBMServices throws RuntimeErrors in its static block when it can't connect to the database
- * [UP-874] - AuthorizationImpl never lets go of cached values
- * [UP-880] - NPE during login when attribute value is null
- * [UP-891] - SimpleUserLayoutManagerTest testUpdateFolder semantic equality
- * [UP-892] - SimpleUserLayoutManagerTest testMoveUnderRootNode fails (fixed in 2.5)
- * [UP-893] - DatabaseServerImpl tests fail for non UP data sources
- * [UP-896] - ChannelDefinition.getBase wants IPortalDocument
- * [UP-918] - Null pointer exception in UserLayoutChannelDescription
- * [UP-920] - Passing of remote address with runtime data incomplete
- * [UP-922] - PortalSessionManager static final "startedAt" should be STARTED_AT
- * [UP-923] - PersonDirNameFinder.primGetName() can fail with an NPE
- * [UP-925] - PersonDirNameFinder getName() may return null
- * [UP-926] - AggregatedUserLayoutStore sets supportsOuterJoins false
- * [UP-928] - PersonDirNameFinder not threadsafe
- * [UP-929] - RDBMChannelRegistryStore: Remove catch Exception references or replace with more specific exception type
- * [UP-930] - Fixup Exception handling in org.jasig.portal.groups.filesystem
- * [UP-941] - Channel Subscriber gets StackOverflowError when trying to list channels
- * [UP-942] - log Throwable stack trace in ChannelManager.replaceWithErrorChannel()
- * [UP-944] - StackOverflowError Login during rendering
- * [UP-946] - Restore safety to channel rendering
- * [UP-949] - cusermanager: md5passwd.java should be Md5passwd.java
- * [UP-951] - RDBMServices compares strings by reference in getConnection(String)
- * [UP-952] - DatabaseTagHandler: Print out stack trace in log.error()
- * [UP-953] - no retry and refresh buttons are displayed in error channel after timeout
- * [UP-955] - JavaDoc declarations of constants in CUserManager Constants don't match values
- * [UP-956] - IFragmentRegistry empty @return tag
- * [UP-957] - DBCPDataSourceFactory JavaDoc comment references non-existing method
- * [UP-960] - IFragment @return tag has no arguments
- * [UP-961] - ALNode methods with no-arg @return tags
- * [UP-963] - no-arg @return JavaDoc for ErrorCode isRefreshAllowed()
- * [UP-972] - Fix AccountStoreFactory JavaDoc
- * [UP-973] - AuthzServiceFactoryImpl type JavaDoc before import
- * [UP-975] - BoundedQueue type JavaDoc trapped
- * [UP-976] - CViewer type comment not marked as JavaDoc
- * [UP-977] - CacheSecurityContextFactory type JavaDoc trapped before import
- * [UP-978] - ant runtests target requires hsqldb
-
-New Feature
-
- * [UP-784] - include CUserManager by default
- * [UP-785] - ability to purge XSLT cache
- * [UP-840] - DLM as alternative LM
- * [UP-853] - Add API and facility for deploy and runtime sanity checking
- * [UP-854] - Include JAXP 1.3 jars with uPortal
- * [UP-895] - JAXP-Install Ant target
- * [UP-903] - RDBMServices.getDataSource()
- * [UP-904] - RDBMServices.getDataSource(String dbName)
- * [UP-905] - Core database meta data
- * [UP-945] - errorHandling tab
- * [UP-948] - add CTimeout channel
- * [UP-964] - CError refactoring
- * [UP-971] - BaseChannel and BaseMultithreadedChannel should bear Log instances
-
-Task
-
- * [UP-839] - remove deprecated WSRP Producer
- * [UP-981] - eliminate BoundedThreadPool, UnboundedThreadPool
- * [UP-982] - update version data for 2.5.0M1
-
-Improvement
-
- * [UP-117] - Need to be able to publish xml/xsl
- * [UP-385] - Utility to modify url depending on user attributes
- * [UP-686] - Add the ability to pool connections defined in rdbm.properties
- * [UP-687] - JNDI to JDBC fail over
- * [UP-688] - Configurable JNDI names
- * [UP-689] - Removed use of and deprecated RDBMServices.PreparedStatement
- * [UP-690] - RDBMServices refactoring
- * [UP-691] - RDBMServices get default server
- * [UP-692] - LDAPServices get default server
- * [UP-697] - PLT18 - Expiration Caching of the portlet spec is not implemented
- * [UP-742] - Get a list of servers from LdapServices
- * [UP-757] - check versions of important libraries on startup
- * [UP-763] - Make PortalSecurityException chainable
- * [UP-768] - Change default ant target to output help message
- * [UP-774] - Add BasicLocalConnectionContext.java to uPortal CVS
- * [UP-777] - Springify the PersonDirectory service
- * [UP-804] - deprecate extraneous ChannelParameter constructor
- * [UP-805] - JavaDoc ChannelParameter
- * [UP-821] - patch to make CContentSubscriber search case insensitive
- * [UP-835] - upgrade to JAXP 1.3 XML APIs
- * [UP-848] - CGenericXSLT pass static params to xsl transforms
- * [UP-852] - RDBMServices getConnection fail with a RuntimeException rather than with null
- * [UP-855] - UserInstanceManager chain PortalSecurityException when unable to obtain person
- * [UP-856] - Upgrade pluto to 1.0.1-rc2
- * [UP-861] - move to mainstream thread pool impl
- * [UP-883] - portlet IChannel marker interface
- * [UP-894] - Update LdapServices link in SimpleLdapSecurityContext JavaDoc
- * [UP-899] - Activate GroupService JavaDoc comments
- * [UP-901] - Direct JNDI lookup for DS referenced from PersonDirs.xml
- * [UP-902] - Don't log stack trace for expected sql errors
- * [UP-916] - package scope PersonDirInfo code
- * [UP-917] - PersonDirInfoAdaptor static method
- * [UP-919] - Move IPersonAttributeDao out of support package
- * [UP-936] - EntityLockTester becomes EntityLockTest
- * [UP-937] - Rename PAGSTester to PAGSTest
- * [UP-938] - Remove external dependencies and rename filesystem unit test class
- * [UP-954] - document JNDI name for uPortal DataSource
- * [UP-959] - JavaDoc improvements to FrameworkMBeanImpl
- * [UP-965] - MovingAverage comment improvements
- * [UP-974] - add @since tag for properties package
+This release was engineered on an
+IBM Thinkpad R31 / Windows XP SP2 / Eclipse 3.0.1 / HSQLDB,
+building under JDK 1.5.0_01 and testing in a Tomcat 5.5.9 under the same JDK.
+and was actually built on a RedHat Linux machine using a version of the shell script in /etc/.
View
119 scripts/createTables-hypersonic.script
@@ -1,119 +0,0 @@
-CREATE TABLE UP_USERS
-(
- ID INTEGER,
- USER_NAME VARCHAR(15) NOT NULL,
- FIRST_NAME VARCHAR(15),
- LAST_NAME VARCHAR(15),
- USER_LAYOUT_XML LONGVARCHAR,
- PRIMARY KEY (ID)
-);
-
-CREATE TABLE UP_SHADOW
-(
- USER_NAME VARCHAR (64),
- PASSWORD VARCHAR (64)
-);
-
-CREATE INDEX PORTAL_SHADOW_PK ON
- UP_SHADOW(USER_NAME);
-
-CREATE TABLE UP_CHANNELS
-(
- CHAN_ID INTEGER NOT NULL,
- TITLE VARCHAR(256) NULL,
- PUB_EMAIL VARCHAR(100) NULL,
- APPROVED INTEGER NULL,
- CHANNEL_XML LONGVARCHAR NOT NULL,
- PRIMARY KEY (CHAN_ID)
-);
-
-CREATE TABLE UP_CHAN_TYPES (
- NAME VARCHAR(70) NOT NULL,
- TYPE VARCHAR(50) NOT NULL,
- DESCR LONGVARCHAR NOT NULL,
- DEF_URI LONGVARCHAR NOT NULL,
- PRIMARY KEY (NAME)
-);
-
-CREATE TABLE UP_CLASS
-(
- CLASS_ID INTEGER NOT NULL,
- NAME VARCHAR(100) NOT NULL,
- PRIMARY KEY (CLASS_ID)
-);
-
-CREATE TABLE UP_CHAN_CLASS
-(
- CLASS_ID INTEGER NOT NULL,
- CHAN_ID INTEGER NOT NULL
-);
-
-CREATE TABLE UP_USER_PREFS
-(
- USER_NAME VARCHAR(15) NOT NULL,
- MEDIA VARCHAR(15) NOT NULL,
- STRUCTURE_STYLESHEET_NAME VARCHAR(30) NOT NULL,
- THEME_STYLESHEET_NAME VARCHAR(30) NOT NULL,
- CSS_STYLESHEET_NAME VARCHAR(30) NOT NULL
-);
-
-CREATE TABLE UP_USER_SS_PREFS
-(
- USER_NAME VARCHAR(15) NOT NULL,
- STYLESHEET_NAME VARCHAR(30) NOT NULL,
- USER_PREFERENCES_XML LONGVARCHAR
-);
-
-CREATE TABLE UP_STRUCT_SS
-(
- STYLESHEET_NAME VARCHAR(30) NOT NULL,
- STYLESHEET_URI LONGVARCHAR NOT NULL,
- STYLESHEET_DESCRIPTION_URI LONGVARCHAR NOT NULL,
- STYLESHEET_DESCRIPTION_TEXT LONGVARCHAR,
- PRIMARY KEY (STYLESHEET_NAME)
-);
-
-CREATE TABLE UP_THEME_SS
-(
- STYLESHEET_NAME VARCHAR(30) NOT NULL,
- STYLESHEET_URI LONGVARCHAR NOT NULL,
- STYLESHEET_DESCRIPTION_URI LONGVARCHAR NOT NULL,
- STYLESHEET_DESCRIPTION_TEXT LONGVARCHAR,
- PRIMARY KEY (STYLESHEET_NAME)
-);
-
-CREATE TABLE UP_CSS_SS
-(
- STYLESHEET_NAME VARCHAR(30) NOT NULL,
- STYLESHEET_URI LONGVARCHAR NOT NULL,
- STYLESHEET_DESCRIPTION_URI LONGVARCHAR NOT NULL,
- STYLESHEET_DESCRIPTION_TEXT LONGVARCHAR,
- PRIMARY KEY (STYLESHEET_NAME)
-);
-
-CREATE TABLE UP_STRUCT_SS_MAP
-(
- MEDIA VARCHAR(15) NOT NULL,
- STRUCTURE_STYLESHEET_NAME VARCHAR(30) NOT NULL
-);
-
-CREATE TABLE UP_THEME_SS_MAP
-(
- THEME_STYLESHEET_NAME VARCHAR(30) NOT NULL,
- STRUCTURE_STYLESHEET_NAME VARCHAR(30) NOT NULL
-);
-
-CREATE TABLE UP_CSS_SS_MAP
-(
- CSS_STYLESHEET_NAME VARCHAR(30) NOT NULL,
- THEME_STYLESHEET_NAME VARCHAR(30) NOT NULL
-);
-
-CREATE TABLE UPC_BOOKMARKS
-(
- ID INTEGER,
- PORTAL_USER_ID INTEGER,
- BOOKMARK_XML LONGVARCHAR,
- PRIMARY KEY (ID)
-);
-
View
15 scripts/dropTables.script
@@ -1,15 +0,0 @@
-DROP TABLE UP_USERS;
-DROP TABLE UP_SHADOW;
-DROP TABLE UP_CHANNELS;
-DROP TABLE UP_CHAN_TYPES;
-DROP TABLE UP_CLASS;
-DROP TABLE UP_CHAN_CLASS;
-DROP TABLE UP_USER_PREFS;
-DROP TABLE UP_USER_SS_PREFS;
-DROP TABLE UP_STRUCT_SS;
-DROP TABLE UP_THEME_SS;
-DROP TABLE UP_CSS_SS;
-DROP TABLE UP_STRUCT_SS_MAP;
-DROP TABLE UP_THEME_SS_MAP;
-DROP TABLE UP_CSS_SS_map;
-DROP TABLE UPC_BOOKMARKS;
View
269 scripts/populateTables.script
@@ -1,269 +0,0 @@
-INSERT INTO UP_USERS (ID, USER_NAME, FIRST_NAME, LAST_NAME) values (0, 'guest', 'Guest', 'Guest');
-
-INSERT INTO UP_USERS (ID, USER_NAME, FIRST_NAME, LAST_NAME) VALUES (1, 'demo', 'Demo', 'User');
-INSERT INTO UP_SHADOW (USER_NAME, PASSWORD) VALUES ('demo', '{MD5}IAnYXaWGdqTkifNNwo0bfIIphj2NPvSG');
-
-UPDATE UP_USERS SET USER_LAYOUT_XML=
-'<?xml version="1.0"?>
-<!DOCTYPE layout SYSTEM "file:/userLayout.dtd">
-<layout>
- <folder ID="t01" priority="1" name="Main">
- <folder ID="col01" priority="0" width="40%" name="Column 1">
- <channel ID="chan00" priority="0" timeout="5000" minimized="false" editable="false" hasHelp="true" removable="true" detachable="false" class="org.jasig.portal.channels.CLogin" name="Login">
- </channel>
- <channel ID="chan01" priority="0" timeout="5000" minimized="false" editable="false" hasHelp="false" removable="true" detachable="true" class="org.jasig.portal.channels.CGenericXSLT" name="MozillaZine">
- <parameter value="webpages/rss/netscape.rss" name="xml"/>
- <parameter value="webpages/stylesheets/org/jasig/portal/channels/CGenericXSLT/RSS.ssl" name="ssl"/>
- </channel>
- <channel ID="chan02" priority="1" timeout="5000" minimized="false" editable="false" hasHelp="false" removable="true" detachable="true" class="org.jasig.portal.channels.CGenericXSLT" name="StockCharts.com">
- <parameter value="webpages/rss/stockcharts.rss" name="xml"/>
- <parameter value="webpages/stylesheets/org/jasig/portal/channels/CGenericXSLT/RSS.ssl" name="ssl"/>
- </channel>
- </folder>
- <folder ID="col02" priority="0" width="60%" name="Column 2">
- <channel ID="chan03" priority="0" timeout="5000" minimized="false" editable="true" hasHelp="true" removable="true" detachable="true" class="org.jasig.portal.channels.CBookmarks" name="Bookmarks">
- </channel>
- <channel ID="chan04" priority="0" timeout="5000" minimized="false" editable="false" hasHelp="false" removable="true" detachable="true" class="org.jasig.portal.channels.CGenericXSLT" name="XML.com">
- <parameter value="webpages/rss/news.rss" name="xml"/>
- <parameter value="webpages/stylesheets/org/jasig/portal/channels/CGenericXSLT/RSS.ssl" name="ssl"/>
- </channel>
- </folder>
- </folder>
- <folder ID="t02" priority="0" name="uPortal Tools">
- <channel ID="chan90" priority="0" timeout="5000" minimized="false" editable="false" hasHelp="false" removable="false" detachable="false" class="org.jasig.portal.channels.CSubscriber" name="Subscribe">
- </channel>
- <channel ID="chan92" priority="0" timeout="5000" minimized="false" editable="false" hasHelp="false" removable="false" detachable="false" class="org.jasig.portal.channels.CPublisher" name="Publish">
- </channel>
- <channel ID="chan91" priority="0" timeout="5000" minimized="false" editable="false" hasHelp="false" removable="false" detachable="false" class="org.jasig.portal.channels.CUserPreferences" name="User Preferences">
- </channel>
- </folder>
- <folder ID="t03" priority="0" name="More">
- <folder ID="col03" priority="0" width="50%" name="Column 1">
- <channel ID="chan06" priority="0" timeout="5000" minimized="false" editable="false" hasHelp="false" removable="true" detachable="true" class="org.jasig.portal.channels.CGenericXSLT" name="uPortal-Powered Sites">
- <parameter value="http://interactivebusiness.com/publish/jasigPortalDemos.rss" name="xml"/>
- <parameter value="webpages/stylesheets/org/jasig/portal/channels/CGenericXSLT/RSS.ssl" name="ssl"/>
- </channel>
- <channel ID="chan07" priority="0" timeout="5000" minimized="false" editable="false" hasHelp="false" removable="true" detachable="true" class="org.jasig.portal.channels.CGenericXSLT" name="IBS News">
- <parameter value="http://interactivebusiness.com/publish/ibs.rss" name="xml"/>
- <parameter value="webpages/stylesheets/org/jasig/portal/channels/CGenericXSLT/RSS.ssl" name="ssl"/>
- </channel>
- </folder>
- <folder ID="col04" priority="0" width="50%" name="Column 2">
- <channel ID="chan08" priority="0" timeout="5000" minimized="false" editable="false" hasHelp="false" removable="true" detachable="true" class="org.jasig.portal.channels.CGenericXSLT" name="uPortal Developers Reference">
- <parameter value="http://asigdev.princeton.edu:82/portal/rss/jasigdev.rss" name="xml"/>
- <parameter value="webpages/stylesheets/org/jasig/portal/channels/CGenericXSLT/RSS.ssl" name="ssl"/>
- </channel>
- <channel ID="chan09" priority="0" timeout="5000" minimized="false" editable="false" hasHelp="false" removable="true" detachable="true" class="org.jasig.portal.channels.CGenericXSLT" name="Salon.com">
- <parameter value="http://www.salon.com/feed/RDF/salon_use.rdf" name="xml"/>
- <parameter value="webpages/stylesheets/org/jasig/portal/channels/CGenericXSLT/RSS.ssl" name="ssl"/>
- </channel>
- </folder>
- </folder>
-</layout>' WHERE USER_NAME='guest';
-
-UPDATE UP_USERS SET USER_LAYOUT_XML=
-'<?xml version="1.0"?>
-<!DOCTYPE layout SYSTEM "file:/userLayout.dtd">
-<layout>
- <folder ID="t01" priority="1" name="Main">
- <folder ID="col01" priority="0" width="40%" name="Column 1">
- <channel ID="chan00" priority="0" timeout="5000" minimized="false" editable="false" hasHelp="false" removable="true" detachable="true" class="org.jasig.portal.channels.CNumberGuess" name="Number Guessing Game">
- <parameter value="1" name="minNum"/>
- <parameter value="100" name="maxNum"/>
- </channel>
- <channel ID="chan01" priority="0" timeout="5000" minimized="false" editable="false" hasHelp="false" removable="true" detachable="true" class="org.jasig.portal.channels.CGenericXSLT" name="MozillaZine">
- <parameter value="webpages/rss/netscape.rss" name="xml"/>
- <parameter value="webpages/stylesheets/org/jasig/portal/channels/CGenericXSLT/RSS.ssl" name="ssl"/>
- </channel>
- <channel ID="chan02" priority="1" timeout="5000" minimized="false" editable="false" hasHelp="false" removable="true" detachable="true" class="org.jasig.portal.channels.CGenericXSLT" name="StockCharts.com">
- <parameter value="webpages/rss/stockcharts.rss" name="xml"/>
- <parameter value="webpages/stylesheets/org/jasig/portal/channels/CGenericXSLT/RSS.ssl" name="ssl"/>
- </channel>
- </folder>
- </folder>
- <folder ID="t02" priority="0" name="uPortal Tools">
- <channel ID="chan90" priority="0" timeout="5000" minimized="false" editable="false" hasHelp="false" removable="false" detachable="false" class="org.jasig.portal.channels.CSubscriber" name="Subscribe">
- </channel>
- <channel ID="chan91" priority="0" timeout="5000" minimized="false" editable="false" hasHelp="false" removable="false" detachable="false" class="org.jasig.portal.channels.CUserPreferences" name="User Preferences">
- </channel>
- </folder>
-</layout>' WHERE USER_NAME='demo';
-
-INSERT INTO UP_CHANNELS (CHAN_ID, TITLE, PUB_EMAIL, APPROVED, CHANNEL_XML) VALUES (1, 'Mozillazine', NULL, 0,
-'<channel ID="chan01" priority="0" timeout="5000" minimized="false" editable="false" hasHelp="false" removable="true" detachable="true" class="org.jasig.portal.channels.CGenericXSLT" name="MozillaZine">
- <parameter value="webpages/rss/netscape.rss" name="xml"/>
- <parameter value="webpages/stylesheets/org/jasig/portal/channels/CGenericXSLT/RSS.ssl" name="ssl"/>
- </channel>')
-
-INSERT INTO UP_CHANNELS (CHAN_ID, TITLE, PUB_EMAIL, APPROVED, CHANNEL_XML) VALUES (2, 'Stockcharts', NULL, 0,
-'<channel ID="chan02" priority="1" timeout="5000" minimized="false" editable="false" hasHelp="false" removable="true" detachable="true" class="org.jasig.portal.channels.CGenericXSLT" name="StockCharts.com">
- <parameter value="webpages/rss/stockcharts.rss" name="xml"/>
- <parameter value="webpages/stylesheets/org/jasig/portal/channels/CGenericXSLT/RSS.ssl" name="ssl"/>
- </channel>')
-
-INSERT INTO UP_CHANNELS (CHAN_ID, TITLE, PUB_EMAIL, APPROVED, CHANNEL_XML) VALUES (3, 'Bookmarks', NULL, 0,
-'<channel ID="chan03" priority="0" timeout="5000" minimized="false" editable="true" hasHelp="true" removable="true" detachable="true" class="org.jasig.portal.channels.CBookmarks" name="Bookmarks">
- </channel>')
-
-INSERT INTO UP_CHANNELS (CHAN_ID, TITLE, PUB_EMAIL, APPROVED, CHANNEL_XML) VALUES (4, 'XML.com', NULL, 0,
-'<channel ID="chan04" priority="0" timeout="5000" minimized="false" editable="false" hasHelp="false" removable="true" detachable="true" class="org.jasig.portal.channels.CGenericXSLT" name="XML.com">
- <parameter value="webpages/rss/news.rss" name="xml"/>
- <parameter value="webpages/stylesheets/org/jasig/portal/channels/CGenericXSLT/RSS.ssl" name="ssl"/>
- </channel>')
-
-INSERT INTO UP_CHANNELS (CHAN_ID, TITLE, PUB_EMAIL, APPROVED, CHANNEL_XML) VALUES (5, 'uPortal Demos', NULL, 0,
-'<channel ID="chan05" priority="0" timeout="5000" minimized="false" editable="false" hasHelp="false" removable="true" detachable="true" class="org.jasig.portal.channels.CGenericXSLT" name="uPortal-Powered Sites">
- <parameter value="http://interactivebusiness.com/publish/jasigPortalDemos.rss" name="xml"/>
- <parameter value="webpages/stylesheets/org/jasig/portal/channels/CGenericXSLT/RSS.ssl" name="ssl"/>
- </channel>')
-
-INSERT INTO UP_CHANNELS (CHAN_ID, TITLE, PUB_EMAIL, APPROVED, CHANNEL_XML) VALUES (6, 'IBS News', NULL, 0,
-'<channel ID="chan06" priority="0" timeout="5000" minimized="false" editable="false" hasHelp="false" removable="true" detachable="true" class="org.jasig.portal.channels.CGenericXSLT" name="IBS News">
- <parameter value="http://interactivebusiness.com/publish/ibs.rss" name="xml"/>
- <parameter value="webpages/stylesheets/org/jasig/portal/channels/CGenericXSLT/RSS.ssl" name="ssl"/>
- </channel>')
-
-INSERT INTO UP_CHANNELS (CHAN_ID, TITLE, PUB_EMAIL, APPROVED, CHANNEL_XML) VALUES (7, 'uPortal Developers Reference', NULL, 0,
-'<channel ID="chan07" priority="0" timeout="5000" minimized="false" editable="false" hasHelp="false" removable="true" detachable="true" class="org.jasig.portal.channels.CGenericXSLT" name="uPortal Developers Reference">
- <parameter value="http://asigdev.princeton.edu:82/portal/rss/jasigdev.rss" name="xml"/>
- <parameter value="webpages/stylesheets/org/jasig/portal/channels/CGenericXSLT/RSS.ssl" name="ssl"/>
- </channel>')
-
-INSERT INTO UP_CHAN_TYPES (NAME, TYPE, DESCR, DEF_URI)
-VALUES ('RSS Channel', 'org.jasig.portal.channels.CGenericXSLT',
-'RSS or Rich Site Summary, the most common channel format, is a channel which has its content defined through an XML document. Anyone may publish an RSS channel as long as the specification is adhered to and the file is stored on a publicly accessible web server. You will need to provide a URL for the RSS file.',
-'properties/channel_defs/RSS.xml');
-
-INSERT INTO UP_CHAN_TYPES (NAME, TYPE, DESCR, DEF_URI)
-VALUES ('XSL Channel', 'org.jasig.portal.channels.CGenericXSLT',
-'XSL renders XML to a particular style, is a channel which has its content defined through an XML document. Anyone may publish an XSL channel as long as the specification is adhered to and the file is stored on a publicly accessible web server. You will need to provide a URL or Path for the XML and XSL file.',
-'properties/channel_defs/XSL.xml');
-
-INSERT INTO UP_CLASS ( CLASS_ID, NAME ) VALUES (0, 'News');
-INSERT INTO UP_CLASS ( CLASS_ID, NAME ) VALUES (1, 'Development');
-INSERT INTO UP_CLASS ( CLASS_ID, NAME ) VALUES (2, 'Applications');
-
-INSERT INTO UP_CHAN_CLASS ( CLASS_ID, CHAN_ID ) VALUES(0, 1);
-INSERT INTO UP_CHAN_CLASS ( CLASS_ID, CHAN_ID ) VALUES(0, 2);
-INSERT INTO UP_CHAN_CLASS ( CLASS_ID, CHAN_ID ) VALUES(0, 6);
-INSERT INTO UP_CHAN_CLASS ( CLASS_ID, CHAN_ID ) VALUES(1, 4);
-INSERT INTO UP_CHAN_CLASS ( CLASS_ID, CHAN_ID ) VALUES(1, 5);
-INSERT INTO UP_CHAN_CLASS ( CLASS_ID, CHAN_ID ) VALUES(1, 7);
-INSERT INTO UP_CHAN_CLASS ( CLASS_ID, CHAN_ID ) VALUES(2, 3);
-
-INSERT INTO UP_USER_PREFS (USER_NAME, MEDIA, STRUCTURE_STYLESHEET_NAME, THEME_STYLESHEET_NAME, CSS_STYLESHEET_NAME)
-VALUES ('guest', 'netscape', 'Tab and Column layout', 'Nested tables', 'general CSS');
-
-INSERT INTO UP_USER_PREFS (USER_NAME, MEDIA, STRUCTURE_STYLESHEET_NAME, THEME_STYLESHEET_NAME, CSS_STYLESHEET_NAME)
-VALUES ('guest', 'explorer', 'Tab and Column layout', 'Nested tables', 'general CSS');
-
-INSERT INTO UP_USER_PREFS (USER_NAME, MEDIA, STRUCTURE_STYLESHEET_NAME, THEME_STYLESHEET_NAME, CSS_STYLESHEET_NAME)
-VALUES ('demo', 'netscape', 'Tab and Column layout', 'Nested tables', 'general CSS');
-
-INSERT INTO UP_USER_PREFS (USER_NAME, MEDIA, STRUCTURE_STYLESHEET_NAME, THEME_STYLESHEET_NAME, CSS_STYLESHEET_NAME)
-VALUES ('demo', 'explorer', 'Tab and Column layout', 'Nested tables', 'general CSS');
-
-INSERT INTO UP_USER_SS_PREFS (USER_NAME, STYLESHEET_NAME, USER_PREFERENCES_XML) VALUES ('guest', 'Tab and Column layout', '
-<structurestylesheetuserpreferences>
- <parameters>
- </parameters>
- <folderattributes>
- <attribute name="width">
- <folder folderid="col01" value="70%"/>
- <folder folderid="col02" value="30%"/>
- <folder folderid="col03" value="30%"/>
- <folder folderid="col04" value="70%"/>
- </attribute>
- </folderattributes>
- <channelattributes>
- </channelattributes>
-</structurestylesheetuserpreferences>
-');
-
-INSERT INTO UP_USER_SS_PREFS (USER_NAME, STYLESHEET_NAME, USER_PREFERENCES_XML) VALUES ('guest', 'Nested tables', '
-<themestylesheetuserpreferences>
- <parameters>
- <parameter name="activeTab">2</parameter>
- <parameter name="borderWidth">2</parameter>
- </parameters>
- <folderattributes>
- </folderattributes>
- <channelattributes>
- <attribute name="minimizable">
- <channel channelid="chan01" value="false"/>
- <channel channelid="chan02" value="false"/>
- </attribute>
- </channelattributes>
-</themestylesheetuserpreferences>
-');
-
-INSERT INTO UP_USER_SS_PREFS (USER_NAME, STYLESHEET_NAME, USER_PREFERENCES_XML) VALUES ('demo', 'Tab and Column layout', '
-<structurestylesheetuserpreferences>
- <parameters>
- </parameters>
- <folderattributes>
- <attribute name="width">
- <folder folderid="col01" value="70%"/>
- <folder folderid="col02" value="30%"/>
- <folder folderid="col03" value="30%"/>
- <folder folderid="col04" value="70%"/>
- </attribute>
- </folderattributes>
- <channelattributes>
- </channelattributes>
-</structurestylesheetuserpreferences>
-');
-
-INSERT INTO UP_USER_SS_PREFS (USER_NAME, STYLESHEET_NAME, USER_PREFERENCES_XML) VALUES ('demo', 'Nested tables', '
-<themestylesheetuserpreferences>
- <parameters>
- <parameter name="activeTab">1</parameter>
- <parameter name="borderWidth">1</parameter>
- </parameters>
- <folderattributes>
- </folderattributes>
- <channelattributes>
- <attribute name="minimizable">
- <channel channelid="chan01" value="false"/>
- <channel channelid="chan02" value="false"/>
- </attribute>
- </channelattributes>
-</themestylesheetuserpreferences>
-');
-
-INSERT INTO UP_STRUCT_SS (STYLESHEET_NAME, STYLESHEET_URI, STYLESHEET_DESCRIPTION_URI, STYLESHEET_DESCRIPTION_TEXT)
-VALUES ('Tab and Column layout', 'webpages/stylesheets/org/jasig/portal/LayoutBean/uLayout2sLayout.xsl', 'webpages/stylesheets/org/jasig/portal/LayoutBean/uLayout2sLayout.sdf', 'Presents the layout in terms of tabs and columns.');
-
-INSERT INTO UP_THEME_SS (STYLESHEET_NAME, STYLESHEET_URI, STYLESHEET_DESCRIPTION_URI, STYLESHEET_DESCRIPTION_TEXT)
-VALUES ('Nested tables', 'webpages/stylesheets/org/jasig/portal/LayoutBean/sLayout2html_full.xsl', 'webpages/stylesheets/org/jasig/portal/LayoutBean/sLayout2html_full.sdf', 'Renders tabs and columns as nested tables');
-
-INSERT INTO UP_CSS_SS (STYLESHEET_NAME, STYLESHEET_URI, STYLESHEET_DESCRIPTION_URI, STYLESHEET_DESCRIPTION_TEXT)
-VALUES ('general CSS', 'webpages/media/org/jasig/portal/layout/tabColumn/general.css', 'webpages/media/org/jasig/portal/layout/tabColumn/general.sdf', 'Body, channel tabs and link coloring and fonts');
-
-INSERT INTO UP_CSS_SS_MAP (CSS_STYLESHEET_NAME, THEME_STYLESHEET_NAME) VALUES ('general CSS', 'Nested tables');
-
-INSERT INTO UP_THEME_SS_MAP (THEME_STYLESHEET_NAME, STRUCTURE_STYLESHEET_NAME) VALUES ('Nested tables', 'Tab and Column layout');
-
-INSERT INTO UP_STRUCT_SS_MAP (MEDIA, STRUCTURE_STYLESHEET_NAME) VALUES ('netscape', 'Tab and Column layout');
-
-INSERT INTO UP_STRUCT_SS_MAP (MEDIA, STRUCTURE_STYLESHEET_NAME) VALUES ('explorer', 'Tab and Column layout');
-
-INSERT INTO UPC_BOOKMARKS (ID, PORTAL_USER_ID, BOOKMARK_XML) VALUES (0, 0,
-'<?xml version="1.0"?>
-<bookmarks>
- <bookmark url="http://www.jasig.org" name="JA-SIG" comments="Java in Administration Special Interest Group"/>
- <bookmark url="http://www.interactivebusiness.com" name="IBS" comments="provides uPortal Services"/>
- <bookmark url="http://www.paypal.com" name="PayPal" comments="Send and receive money online!"/>
- <bookmark url="http://google.com" name="Google" comments="great search engine"/>
-</bookmarks>
-');
-
-INSERT INTO UPC_BOOKMARKS (ID, PORTAL_USER_ID, BOOKMARK_XML) VALUES (1, 1,
-'<?xml version="1.0"?>
-<bookmarks>
- <bookmark url="http://www.jasig.org" name="JA-SIG" comments="Java in Administration Special Interest Group"/>
- <bookmark url="http://www.interactivebusiness.com" name="IBS" comments="provides uPortal Services"/>
- <bookmark url="http://www.paypal.com" name="PayPal" comments="Send and receive money online!"/>
- <bookmark url="http://google.com" name="Google" comments="great search engine"/>
-</bookmarks>
-');
View
7 source/org/jasig/portal/ChannelIncorporationFilter.java
@@ -14,6 +14,13 @@
/**
* A filter that incorporates content rendered by the channels in to
* the main transformation stream.
+ *
+ * TODO: there are enhancements in CharacterCachingChannelIncorporationFilter as
+ * of uPortal 2.5.1 to support dynamic channel titles. Do those enhancements need
+ * to be copied here? Or is the functionality of this class duplicated by a
+ * degenerate (non-caching) configuration of CharacterCachingChannelIncorporationFilter,
+ * such that it would be a worthwhile reduction of code duplication to drop this
+ * class?
*
* @author <a href="mailto:pkharchenko@interactivebusiness.com">Peter Kharchenko</a>
* @version $Revision$
View
113 source/org/jasig/portal/ChannelManager.java
@@ -25,6 +25,7 @@
import javax.naming.NamingException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -32,6 +33,7 @@
import org.jasig.portal.channels.CSecureInfo;
import org.jasig.portal.channels.error.CError;
import org.jasig.portal.channels.error.ErrorCode;
+import org.jasig.portal.channels.support.IDynamicChannelTitleRenderer;
import org.jasig.portal.i18n.LocaleManager;
import org.jasig.portal.layout.IUserLayout;
import org.jasig.portal.layout.IUserLayoutManager;
@@ -102,7 +104,8 @@
// global channel rendering cache
public static final int SYSTEM_CHANNEL_CACHE_MIN_SIZE=50; // this should be in a file somewhere
- public static final SoftHashMap systemCache=new SoftHashMap(SYSTEM_CHANNEL_CACHE_MIN_SIZE);
+
+ public static final Map systemCache = new SoftHashMap(SYSTEM_CHANNEL_CACHE_MIN_SIZE);
public static final String channelAddressingPathElement="channel";
private static boolean useAnchors = PropertiesManager.getPropertyAsBoolean("org.jasig.portal.ChannelManager.use_anchors", false);
@@ -341,6 +344,7 @@ public void outputChannel(String channelSubscribeId,ContentHandler contentHandle
if(cs.stopCaching()) {
try {
characterContent=cs.getCache();
+ log.debug("outputChannel 2: "+characterContent);
if(characterContent!=null) {
// save compiled character cache
cr.setCharacterCache(characterContent);
@@ -693,21 +697,38 @@ private IChannel instantiateChannel(IUserLayoutChannelDescription cd) throws Por
if(ap.canRender(Integer.parseInt(channelPublishId))) {
// Instantiate the channel and notify the StatsRecorder
- ch = ChannelFactory.instantiateLayoutChannel(cd,this.pcs.getHttpServletRequest().getSession(false).getId());
- StatsRecorder.recordChannelInstantiated(upm.getPerson(), upm.getCurrentProfile(), cd);
-
- // Create and stuff the channel static data
- ChannelStaticData sd = new ChannelStaticData();
- sd.setChannelSubscribeId(channelSubscribeId);
- sd.setTimeout(cd.getTimeout());
- sd.setParameters(cd.getParameterMap());
- sd.setPerson(upm.getPerson());
- sd.setJNDIContext(channelContext);
- sd.setICCRegistry(new ICCRegistry(this,channelSubscribeId));
- sd.setChannelPublishId(cd.getChannelPublishId());
-
- ch.setStaticData(sd);
+ HttpServletRequest sr = this.pcs.getHttpServletRequest();
+ if (sr == null){
+ ch=new CError(ErrorCode.GENERAL_ERROR,"Unable to get SessionId. getHttpServletRequest returned null.",channelSubscribeId,null);
+ }else{
+ HttpSession hs = sr.getSession(false);
+ if (hs == null){
+ ch=new CError(ErrorCode.GENERAL_ERROR,"Unable to get SessionId. getSession returned null.",channelSubscribeId,null);
+ }else{
+ String id = hs.getId();
+ if (id == null){
+ ch=new CError(ErrorCode.GENERAL_ERROR,"Unable to get SessionId. getId returned null.",channelSubscribeId,null);
+ }else{
+
+ ch = ChannelFactory.instantiateLayoutChannel(cd,id);
+ StatsRecorder.recordChannelInstantiated(upm.getPerson(), upm.getCurrentProfile(), cd);
+
+ // Create and stuff the channel static data
+ ChannelStaticData sd = new ChannelStaticData();
+ sd.setChannelSubscribeId(channelSubscribeId);
+ sd.setTimeout(cd.getTimeout());
+ sd.setParameters(cd.getParameterMap());
+ sd.setPerson(upm.getPerson());
+ sd.setJNDIContext(channelContext);
+ sd.setICCRegistry(new ICCRegistry(this,channelSubscribeId));
+ sd.setChannelPublishId(cd.getChannelPublishId());
+
+ ch.setStaticData(sd);
+ }
+ }
+ }
+
} else {
// user is not authorized to instantiate this channel
// create an instance of an error channel instead
@@ -818,8 +839,17 @@ private void processRequestChannelParameters(HttpServletRequest req) {
try {
chObj=instantiateChannel(channelTarget);
} catch (Throwable e) {
- log.error("unable to pass find/create an instance of a channel. " +
- "Bogus Id ? ! (id=\""+channelTarget+"\").", e);
+ if (upm.getPerson().isGuest() == true)
+ {
+ // We get this alot when people's sessions have timed out and they get directed
+ // to the guest page. Changed to WARN because there might be a need to note this
+ // to diagnose problems with the guest layout.
+
+ log.warn("ChannelManager::processRequestChannelParameters() : unable to pass find/create an instance of a channel. Bogus Id ? ! (id=\""+channelTarget+"\").");
+ }else{
+ log.error("ChannelManager::processRequestChannelParameters() : unable to pass find/create an instance of a channel. Bogus Id ? ! (id=\""
+ +channelTarget+"\" uid=\""+upm.getPerson().getID()+"\").",e);
+ }
chObj=replaceWithErrorChannel(channelTarget,ErrorCode.SET_STATIC_DATA_EXCEPTION,e,null,false);
}
}
@@ -949,7 +979,7 @@ public void startRenderingCycle(HttpServletRequest request, HttpServletResponse
try {
portalContext=getPortalContext();
} catch (NamingException ne) {
- log.error("ChannelManager::setReqNRes(): exception raised when trying to obtain initial JNDI context : ", ne);
+ log.error(ne, ne);
}
}
// construct a channel context
@@ -957,7 +987,7 @@ public void startRenderingCycle(HttpServletRequest request, HttpServletResponse
try {
channelContext=getChannelJndiContext(portalContext,request.getSession(false).getId(),Integer.toString(this.pcs.getUserPreferencesManager().getPerson().getID()),Integer.toString(this.pcs.getUserPreferencesManager().getCurrentProfile().getLayoutId()));
} catch (NamingException ne) {
- log.error("ChannelManager::setReqNRes(): exception raised when trying to obtain channel JNDI context : ", ne);
+ log.error(ne, ne);
}
}
processRequestChannelParameters(request);
@@ -1114,7 +1144,10 @@ private IChannelRenderer startChannelRendering(String channelSubscribeId,boolean
}
// Check if channel is rendering as the root element of the layout
- String userLayoutRoot = upm.getUserPreferences().getStructureStylesheetUserPreferences().getParameterValue("userLayoutRoot");
+
+ UserPreferences tempUserPref = upm.getUserPreferences();
+ StructureStylesheetUserPreferences tempSSUP = tempUserPref.getStructureStylesheetUserPreferences();
+ String userLayoutRoot = tempSSUP.getParameterValue("userLayoutRoot");
if (rd != null && userLayoutRoot != null && !userLayoutRoot.equals(IUserLayout.ROOT_NODE_NAME)) {
rd.setRenderingAsRoot(true);
}
@@ -1227,4 +1260,44 @@ public void layoutLoaded() {}
public void layoutSaved() {}
public void setLocaleManager(LocaleManager lm) { this.lm = lm; }
+
+ /**
+ * Get the dynamic channel title for a given channelSubscribeID.
+ * Returns null if no dynamic channel (the rendering infrastructure
+ * calling this method should fall back on a default title when this
+ * method returns null).
+ * @param channelSubscribeId
+ * @throws IllegalArgumentException if channelSubcribeId is null
+ * @thorws IllegalStateException if
+ */
+ public String getChannelTitle(String channelSubscribeId) {
+
+ if (log.isTraceEnabled()) {
+ log.trace("ChannelManager getting dynamic title for channel with subscribe id=" + channelSubscribeId);
+ }
+
+ // obtain IChannelRenderer
+ Object channelRenderer = rendererTable.get(channelSubscribeId);
+
+ // default to null (no dynamic channel title.
+ String channelTitle = null;
+
+ // dynamic channel title support is not in IChannelRenderer itself because
+ // that would have required a change to the IChannelRenderer interface
+ if (channelRenderer instanceof IDynamicChannelTitleRenderer ) {
+
+ IDynamicChannelTitleRenderer channelTitleRenderer =
+ (IDynamicChannelTitleRenderer) channelRenderer;
+ channelTitle = channelTitleRenderer.getChannelTitle();
+
+ if (log.isTraceEnabled()) {
+ log.trace("ChannelManager reports that dynamic title for channel with subscribe id="
+ + channelSubscribeId + " is [" + channelTitle + "].");
+ }
+ }
+
+
+ return channelTitle;
+
+ }
}
View
171 source/org/jasig/portal/ChannelRenderer.java
@@ -9,6 +9,8 @@
import java.io.StringWriter;
import java.util.Map;
+import org.jasig.portal.channels.support.IChannelTitle;
+import org.jasig.portal.channels.support.IDynamicChannelTitleRenderer;
import org.jasig.portal.properties.PropertiesManager;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -32,10 +34,9 @@
* @version $Revision$
*/
public class ChannelRenderer
- implements IChannelRenderer
+ implements IChannelRenderer, IDynamicChannelTitleRenderer
{
-
- private static final Log log = LogFactory.getLog(ChannelRenderer.class);
+ protected final Log log = LogFactory.getLog(getClass());
/**
* Default value for CACHE_CHANNELS.
@@ -70,7 +71,6 @@
protected SetCheckInSemaphore groupSemaphore;
protected Object groupRenderingKey;
- private Object cacheWriteLock;
/**
* Default contstructor
@@ -84,7 +84,6 @@ public ChannelRenderer (IChannel chan,ChannelRuntimeData runtimeData, ExecutorSe
this.rd=runtimeData;
this.rendering = false;
this.ccacheable=false;
- this.cacheWriteLock=new Object();
tp = threadPool;
if(systemCache==null) {
@@ -118,15 +117,15 @@ public ChannelRenderer (IChannel chan,ChannelRuntimeData runtimeData, ExecutorSe
* @param channel an <code>IChannel</code>
*/
public void setChannel(IChannel channel) {
- if (log.isDebugEnabled())
- log.debug("ChannelRenderer::setChannel() : channel is being reset!");
+ if (log.isDebugEnabled()) {
+ log.debug("ChannelRenderer::setChannel() : channel is being reset!");
+ }
this.channel=channel;
if(this.worker!=null) {
this.worker.setChannel(channel);
}
// clear channel chace
this.channelCache=null;
- this.cacheWriteLock=new Object();
}
/**
@@ -221,7 +220,7 @@ public int outputRendering (ContentHandler out) throws Throwable {
return RENDERING_SUCCESSFUL;
} catch (SAXException e) {
// worst case scenario: partial content output :(
- log.error( "ChannelRenderer::outputRendering() : following SAX exception occured : "+e);
+ log.error( "ChannelRenderer::outputRendering() : following SAX exception occured : "+e, e);
throw e;
}
} else {
@@ -263,9 +262,10 @@ public int completeRendering() throws Throwable {
if(!this.worker.isSetRuntimeDataComplete() && !this.workTracker.isDone()) {
this.workTracker.cancel(true);
abandoned=true;
- if (log.isDebugEnabled())
+ if (log.isDebugEnabled()) {
log.debug("ChannelRenderer::outputRendering() : killed. " +
"(key="+this.groupRenderingKey.toString()+")");
+ }
} else {
this.groupSemaphore.waitOn();
}
@@ -277,7 +277,10 @@ public int completeRendering() throws Throwable {
try {
this.workTracker.get(this.timeOut, TimeUnit.MILLISECONDS);
} catch (TimeoutException te) {
- log.debug("ChannelRenderer::outputRendering() : timed out", te);
+ if (log.isDebugEnabled()) {
+ log.debug("ChannelRenderer::outputRendering() : timed out", te);
+ }
+
}
if(!this.workTracker.isDone()) {
@@ -376,17 +379,47 @@ public String toString() {
return sb.toString();
}
-
+
+
+ public String getChannelTitle() {
+
+
+ if (log.isTraceEnabled()) {
+ log.trace("Getting channel title for ChannelRenderer " + this);
+ }
+
+ // default to null, which indicates the ChannelRenderer doesn't have
+ // a dynamic channel title available.
+ String channelTitle = null;
+ try {
+ // block on channel rendering to allow channel opportunity to
+ // provide dynamic title.
+ int renderingStatus = completeRendering();
+ if (renderingStatus == RENDERING_SUCCESSFUL) {
+ channelTitle = this.worker.getChannelTitle();
+ }
+ } catch (Throwable t) {
+ log.error("Channel rendering failed while getting title for channel renderer " + this, t);
+ }
+
+ // will be null indicating no dynamic title unless successfully obtained title.
+ return channelTitle;
+
+ }
protected class Worker extends BaseTask {
private boolean successful;
private boolean done;
private boolean setRuntimeDataComplete;
- private boolean decremented;
private IChannel channel;
private ChannelRuntimeData rd;
private SAX2BufferImpl buffer;
private String cbuffer;
+
+ /**
+ * The dynamic title of the channel, if any. Null otherwise.
+ */
+ private String channelTitle = null;
public Worker (IChannel ch, ChannelRuntimeData runtimeData) {
this.channel=ch; this.rd=runtimeData;
@@ -427,15 +460,21 @@ public void execute () throws Exception {
// use it
if(ccacheable && (entry.buffer instanceof String)) {
cbuffer=(String)entry.buffer;
- log.debug("ChannelRenderer.Worker::run() : retrieved system-wide cached character content based on a key \""+key.getKey()+"\"");
+ if (log.isDebugEnabled()) {
+ log.debug("ChannelRenderer.Worker::run() : retrieved system-wide cached character content based on a key \""+key.getKey()+"\"");
+ }
} else if(entry.buffer instanceof SAX2BufferImpl) {
buffer=(SAX2BufferImpl) entry.buffer;
- log.debug("ChannelRenderer.Worker::run() : retrieved system-wide cached content based on a key \""+key.getKey()+"\"");
+ if (log.isDebugEnabled()) {
+ log.debug("ChannelRenderer.Worker::run() : retrieved system-wide cached content based on a key \""+key.getKey()+"\"");
+ }
}
} else {
// remove it
systemCache.remove(key.getKey());
- log.debug("ChannelRenderer.Worker::run() : removed system-wide unvalidated cache based on a key \""+key.getKey()+"\"");
+ if (log.isDebugEnabled()) {
+ log.debug("ChannelRenderer.Worker::run() : removed system-wide unvalidated cache based on a key \""+key.getKey()+"\"");
+ }
}
}
} else {
@@ -448,16 +487,22 @@ public void execute () throws Exception {
// use it
if(ccacheable && (entry.buffer instanceof String)) {
cbuffer=(String)entry.buffer;
- log.debug("ChannelRenderer.Worker::run() : retrieved instance-cached character content based on a key \""+key.getKey()+"\"");
+ if (log.isDebugEnabled()) {
+ log.debug("ChannelRenderer.Worker::run() : retrieved instance-cached character content based on a key \""+key.getKey()+"\"");
+ }
} else if(entry.buffer instanceof SAX2BufferImpl) {
buffer=(SAX2BufferImpl) entry.buffer;
- log.debug("ChannelRenderer.Worker::run() : retrieved instance-cached content based on a key \""+key.getKey()+"\"");
+ if (log.isDebugEnabled()) {
+ log.debug("ChannelRenderer.Worker::run() : retrieved instance-cached content based on a key \""+key.getKey()+"\"");
+ }
}
} else {
// remove it
getChannelCache().remove(key.getKey());
- log.debug("ChannelRenderer.Worker::run() : removed unvalidated instance-cache based on a key \""+key.getKey()+"\"");
+ if (log.isDebugEnabled()) {
+ log.debug("ChannelRenderer.Worker::run() : removed unvalidated instance-cache based on a key \""+key.getKey()+"\"");
+ }
}
}
}
@@ -481,10 +526,14 @@ public void execute () throws Exception {
if (key != null) {
if (key.getKeyScope() == ChannelCacheKey.SYSTEM_KEY_SCOPE) {
systemCache.put(key.getKey(), new ChannelCacheEntry(cbuffer, key.getKeyValidity()));
- log.debug("ChannelRenderer.Worker::run() : recorded system character cache based on a key \"" + key.getKey() + "\"");
+ if (log.isDebugEnabled()) {
+ log.debug("ChannelRenderer.Worker::run() : recorded system character cache based on a key \"" + key.getKey() + "\"");
+ }
} else {
getChannelCache().put(key.getKey(), new ChannelCacheEntry(cbuffer, key.getKeyValidity()));
- log.debug("ChannelRenderer.Worker::run() : recorded instance character cache based on a key \"" + key.getKey() + "\"");
+ if (log.isDebugEnabled()) {
+ log.debug("ChannelRenderer.Worker::run() : recorded instance character cache based on a key \"" + key.getKey() + "\"");
+ }
}
}
} else {
@@ -498,10 +547,14 @@ public void execute () throws Exception {
if(key.getKeyScope()==ChannelCacheKey.SYSTEM_KEY_SCOPE) {
systemCache.put(key.getKey(),new ChannelCacheEntry(buffer,key.getKeyValidity()));
- log.debug("ChannelRenderer.Worker::run() : recorded system cache based on a key \""+key.getKey()+"\"");
+ if (log.isDebugEnabled()) {
+ log.debug("ChannelRenderer.Worker::run() : recorded system cache based on a key \""+key.getKey()+"\"");
+ }
} else {
getChannelCache().put(key.getKey(),new ChannelCacheEntry(buffer,key.getKeyValidity()));
- log.debug("ChannelRenderer.Worker::run() : recorded instance cache based on a key \""+key.getKey()+"\"");
+ if (log.isDebugEnabled()) {
+ log.debug("ChannelRenderer.Worker::run() : recorded instance cache based on a key \""+key.getKey()+"\"");
+ }
}
}
}
@@ -532,9 +585,44 @@ public void execute () throws Exception {
}
this.setException(e);
}
+
+ /*
+ * Get the channel's ChannelRuntimeProperties, and handle them.
+ */
+ processChannelRuntimeProperties();
+
done = true;
}
+ /**
+ * Query the channel for ChannelRuntimePRoperties and process those
+ * properties.
+ *
+ * Currently, only handles the optional @link{IChannelTitle} interface.
+ */
+ private void processChannelRuntimeProperties() {
+ ChannelRuntimeProperties channelProps = this.channel.getRuntimeProperties();
+
+ if (channelProps != null) {
+ if (channelProps instanceof IChannelTitle) {
+
+ this.channelTitle = ((IChannelTitle) channelProps).getChannelTitle();
+ if (log.isTraceEnabled()) {
+ log.trace("Read title " + this.channelTitle + ".");
+ }
+ } else {
+ if (log.isTraceEnabled()) {
+ log.trace("ChannelRuntimeProperties were non-null but did not implement ITitleable.");
+ }
+ }
+ } else {
+ if (log.isTraceEnabled()) {
+ log.trace("ChannelRuntimeProperties were null from channel " + channel);
+ }
+ }
+ }
+
+
public boolean successful () {
return this.successful;
}
@@ -566,12 +654,16 @@ public void setCharacterCache(String chars) {
if(channel instanceof ICacheable ) {
ChannelCacheKey key=((ICacheable)channel).generateKey();
if(key!=null) {
- log.debug("ChannelRenderer::setCharacterCache() : called on a key \""+key.getKey()+"\"");
+ if (log.isDebugEnabled()) {
+ log.debug("ChannelRenderer::setCharacterCache() : called on a key \""+key.getKey()+"\"");
+ }
ChannelCacheEntry entry=null;
if(key.getKeyScope()==ChannelCacheKey.SYSTEM_KEY_SCOPE) {
entry=(ChannelCacheEntry)systemCache.get(key.getKey());
if(entry==null) {
- log.debug("ChannelRenderer::setCharacterCache() : setting character cache buffer based on a system key \""+key.getKey()+"\"");
+ if (log.isDebugEnabled()) {
+ log.debug("ChannelRenderer::setCharacterCache() : setting character cache buffer based on a system key \""+key.getKey()+"\"");
+ }
entry=new ChannelCacheEntry(chars,key.getKeyValidity());
} else {
entry.buffer=chars;
@@ -581,7 +673,9 @@ public void setCharacterCache(String chars) {
// by default we assume INSTANCE_KEY_SCOPE
entry=(ChannelCacheEntry)getChannelCache().get(key.getKey());
if(entry==null) {
- log.debug("ChannelRenderer::setCharacterCache() : no existing cache on a key \""+key.getKey()+"\"");
+ if (log.isDebugEnabled()) {
+ log.debug("ChannelRenderer::setCharacterCache() : no existing cache on a key \""+key.getKey()+"\"");
+ }
entry=new ChannelCacheEntry(chars,key.getKeyValidity());
} else {
entry.buffer=chars;
@@ -589,7 +683,9 @@ public void setCharacterCache(String chars) {
getChannelCache().put(key.getKey(),entry);
}
} else {
- log.debug("ChannelRenderer::setCharacterCache() : channel cache key is null.");
+ if (log.isDebugEnabled()) {
+ log.debug("ChannelRenderer::setCharacterCache() : channel cache key is null.");
+ }
}
}
}
@@ -598,5 +694,26 @@ public void setCharacterCache(String chars) {
public boolean done () {
return this.done;
}
+
+ /**
+ * Get a Sring representing the dynamic channel title reported by the
+ * IChannel this ChannelRenderer rendered. Returns null if the channel
+ * reported no such title or the channel isn't done rendering.
+ *
+ * @return dynamic channel title, or null if no title available.
+ */
+ String getChannelTitle() {
+
+ if (log.isTraceEnabled()) {
+ log.trace("Getting channel title (" + this.channelTitle + "] for " + this);
+ }
+
+ // currently, just provides no dynamic title if not done rendering
+ if (this.done) {
+ return this.channelTitle;
+ } else {
+ return null;
+ }
+ }
}
}
View
12 source/org/jasig/portal/ChannelRendererFactory.java
@@ -32,7 +32,7 @@
public final static String RCS_ID = "@(#) $Header$";
- private static final Log log = LogFactory.getLog(ChannelRendererFactory.class);
+ private static final Log LOG = LogFactory.getLog(ChannelRendererFactory.class);
/**
* <p>Creates a new instance of a channel renderer factory object. This
@@ -60,8 +60,8 @@ public static final IChannelRendererFactory newInstance(
keyBase + ".ChannelRendererFactory.className"
);
- if (log.isDebugEnabled())
- log.debug("ChannelRendererFactory::newInstance(" + keyBase +
+ if (LOG.isDebugEnabled())
+ LOG.debug("ChannelRendererFactory::newInstance(" + keyBase +
") : about to construct channel renderer factory: " +
factoryClassName);
@@ -75,14 +75,14 @@ public static final IChannelRendererFactory newInstance(
new Object[]{ keyBase }
);
- if (log.isDebugEnabled())
- log.debug("ChannelRendererFactory::newInstance(" + keyBase +
+ if (LOG.isDebugEnabled())
+ LOG.debug("ChannelRendererFactory::newInstance(" + keyBase +
") : constructed channel renderer factory: " + factoryClassName);
}
catch( Exception x )
{
// Log the failure.
- log.error(
+ LOG.error(
"ChannelRendererFactory::newInstance(" + keyBase + ") : failed to construct factory: " + factoryClassName,
x
);
View
24 source/org/jasig/portal/ChannelRuntimeData.java
@@ -53,7 +53,7 @@ public ChannelRuntimeData() {
* @return crd the cloned ChannelRuntimeData object
*/
public Object clone() {
- ChannelRuntimeData crd = new ChannelRuntimeData();
+ ChannelRuntimeData crd = (ChannelRuntimeData)super.clone();
crd.binfo = binfo;
crd.locales = locales;
crd.channelUPFile = channelUPFile;
@@ -268,6 +268,28 @@ public String getBaseActionURL(boolean idempotent) {
}
/**
+ * Returns an idempotent URL that includes a single query parameter that
+ * targets a channel for focus mode by functional name. Additional
+ * query parameters appended will be passed to the focused channel via
+ * the channel's ChannelRuntimeData object.
+ *
+ * @return a value of URL including a single query parameter.
+ * @since 2.5.1
+ */
+ public String getFnameActionURL(String fname) {
+ String url=null;
+ try {
+ UPFileSpec upfs=new UPFileSpec(channelUPFile);
+ upfs.setTagId(PortalSessionManager.IDEMPOTENT_URL_TAG);
+ url=upfs.getUPFile();
+ url = url + "?" + Constants.FNAME_PARAM + "=" + fname;
+ } catch (Exception e) {
+ log.error("Unable to construct a fname action URL!", e);
+ }
+ return url;
+ }
+
+ /**
* Returns the URL to invoke one of the workers specified in PortalSessionManager.
* Typically the channel that is invoked with the worker will have to implement an
* interface specific for that worker.
View
56 source/org/jasig/portal/ChannelRuntimeProperties.java
@@ -5,22 +5,68 @@
package org.jasig.portal;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
/**
- * Used to store Runtime channel properties.
+ * Conveys runtime properties from channel to framework.
+ *
+ * <p>In general, the IChannel API contract consists of one-way calls.
+ * The framework instantiates the channel and provisions it with state via
+ * setStaticData() and setRuntimeData(); these are one-way calls from framework
+ * to channel. The channel can fail with an exception, but otherwise cannot
+ * communicate with the framework, write back to these Data objects, etc.
+ * Then there's the renderXML() call, by which the channel writes back to
+ * a content handler to produce output.</p>
+ *
+ * <p>The getRuntimeProperties() IChannel method, and this ChannelRuntimeProperties
+ * object, provides a way for the channel to communicate back to the framework
+ * data other than the content it desires to write out to the end user.
+ * ChannelRuntimeProperties was originally envisioned as a mechanism whereby
+ * an IChannel would convey whether it wishes to render at all, and it was
+ * envisioned that its place in the sequence of IChannel calls would be after
+ * setRuntimeData() but before renderXML(). However, this was not implemented.
+ * Through uPortal 2.5.0, no framework code called getRuntimeProperties() on
+ * IChannels.</p>
+ *
+ * <p>For uPortal 2.5.1, ChannelRuntimeProperties were recruited for use in
+ * implementing dynamic channel titles. Channels returning ChannelRuntimeProperties
+ * which implement the optional interface IChannelTitle convey a desired dynamic title
+ * for rendering by the framework in place of the title defined at channel
+ * publication. In support of this change, the channel rendering framework
+ * was modified to actually get the ChannelRuntimeProperties from channels for
+ * inspection as to whether it implements this interface. This method call was
+ * added <b>after renderXML()</p>, not before as originally envisioned. This
+ * order was selected because many channels are not prepared to know their dynamic
+ * title until after they have rendered - particularly CPortletAdapter, as the
+ * JSR-168 mechanism for portlets to set their titles is part of their
+ * configuration of the RenderResponse.</p>
+ *