Author: jorgeuriarte
Date: 2006-08-07 15:43:30-0700
New Revision: 10257
Added:
trunk/src/java/org/tigris/scarab/notification/ScarabOldNotificationManager.java
- copied unchanged from r10245, /branches/release/b21/src/java/org/tigris/scarab/notification/ScarabOldNotificationManager.java
trunk/src/java/org/tigris/scarab/pipeline/NTLMLoginValve.java
- copied unchanged from r10172, /branches/release/b21/src/java/org/tigris/scarab/pipeline/NTLMLoginValve.java
trunk/src/java/org/tigris/scarab/services/ServiceManager.java
- copied unchanged from r10245, /branches/release/b21/src/java/org/tigris/scarab/services/ServiceManager.java
trunk/src/sql/postgresql/hack-db.sql
- copied unchanged from r10172, /branches/release/b21/src/sql/postgresql/hack-db.sql
trunk/src/webapp/WEB-INF/templates/screens/QueryMatrix.vm
- copied unchanged from r10245, /branches/release/b21/src/webapp/WEB-INF/templates/screens/QueryMatrix.vm
trunk/www/repository/org.samba.jcifs/
- Copied
trunk/www/repository/org.samba.jcifs/jars/
- Copied
trunk/www/repository/org.samba.jcifs/jars/jcifs-1.2.6.jar
- copied unchanged from r10172, /branches/release/b21/www/repository/org.samba.jcifs/jars/jcifs-1.2.6.jar
trunk/xdocs/howto/windowsdomain-howto.xml
- copied unchanged from r10172, /branches/release/b21/xdocs/howto/windowsdomain-howto.xml
Modified:
trunk/ (props changed)
trunk/INSTALL
trunk/extensions/scripts/nightly-tarball.sh
trunk/maven.xml
trunk/project.properties
trunk/project.xml
trunk/src/conf/classes/ScarabBundle_de.properties
trunk/src/conf/classes/ScarabBundle_en.properties
trunk/src/conf/classes/ScarabBundle_es.properties
trunk/src/conf/classes/ScarabBundle_zh_TW.properties
trunk/src/conf/conf/TurbineResources.properties
trunk/src/conf/conf/scarab-pipeline.xml
trunk/src/java/org/apache/fulcrum/localization/Localization.java
trunk/src/java/org/tigris/scarab/actions/AssignIssue.java
trunk/src/java/org/tigris/scarab/actions/Login.java
trunk/src/java/org/tigris/scarab/actions/ModifyIssue.java
trunk/src/java/org/tigris/scarab/actions/ModifyModule.java
trunk/src/java/org/tigris/scarab/actions/MoveIssue.java
trunk/src/java/org/tigris/scarab/actions/ReportIssue.java
trunk/src/java/org/tigris/scarab/actions/admin/AttributeGroupEdit.java
trunk/src/java/org/tigris/scarab/actions/admin/ManagePermissions.java
trunk/src/java/org/tigris/scarab/actions/admin/ManageRoles.java
trunk/src/java/org/tigris/scarab/notification/NotificationManager.java
trunk/src/java/org/tigris/scarab/notification/ScarabNewNotificationManager.java
trunk/src/java/org/tigris/scarab/notification/ScarabNotificationManager.java
trunk/src/java/org/tigris/scarab/om/AbstractScarabModule.java
trunk/src/java/org/tigris/scarab/om/AbstractScarabUser.java
trunk/src/java/org/tigris/scarab/om/Activity.java
trunk/src/java/org/tigris/scarab/om/GlobalParameter.java
trunk/src/java/org/tigris/scarab/om/Issue.java
trunk/src/java/org/tigris/scarab/om/IssueTemplateInfo.java
trunk/src/java/org/tigris/scarab/om/MITListItem.java
trunk/src/java/org/tigris/scarab/om/Module.java
trunk/src/java/org/tigris/scarab/om/NotificationFilterManager.java
trunk/src/java/org/tigris/scarab/om/NotificationStatus.java
trunk/src/java/org/tigris/scarab/om/ParentChildAttributeOption.java
trunk/src/java/org/tigris/scarab/om/ROptionOption.java
trunk/src/java/org/tigris/scarab/om/ScarabModule.java
trunk/src/java/org/tigris/scarab/om/ScarabUser.java
trunk/src/java/org/tigris/scarab/om/ScarabUserImpl.java
trunk/src/java/org/tigris/scarab/pipeline/AnonymousLoginValve.java
trunk/src/java/org/tigris/scarab/pipeline/DetermineTargetValve.java
trunk/src/java/org/tigris/scarab/screens/IssueListExport.java
trunk/src/java/org/tigris/scarab/screens/ScarabDefault.java
trunk/src/java/org/tigris/scarab/services/cache/ScarabCache.java
trunk/src/java/org/tigris/scarab/tools/ScarabGlobalTool.java
trunk/src/java/org/tigris/scarab/tools/ScarabRequestTool.java
trunk/src/java/org/tigris/scarab/tools/localization/L10NKeySet.java
trunk/src/java/org/tigris/scarab/util/AnonymousUserUtil.java
trunk/src/java/org/tigris/scarab/util/ComponentLocator.java
trunk/src/java/org/tigris/scarab/util/Email.java
trunk/src/java/org/tigris/scarab/util/ScarabConstants.java
trunk/src/java/org/tigris/scarab/util/ScarabException.java
trunk/src/java/org/tigris/scarab/util/ScarabUtil.java
trunk/src/java/org/tigris/scarab/util/word/IssueSearch.java
trunk/src/java/org/tigris/scarab/util/word/LuceneSearchIndex.java
trunk/src/java/org/tigris/scarab/util/word/SearchFactory.java
trunk/src/java/org/tigris/scarab/util/xmlissues/ScarabIssues.java
trunk/src/schema/scarab-schema.xml
trunk/src/sql/mysql/upgrade/mysql-upgrade-1.0b20-1.0b21-1.sql
trunk/src/sql/mysql/upgrade/mysql-upgrade-1.0b20-1.0b21-2.sql
trunk/src/sql/mysql/upgrade/mysql-upgrade-1.0b20-1.0b21-3.sql
trunk/src/sql/oracle/upgrade/oracle-upgrade-1.0b20-1.0b21-2.sql
trunk/src/sql/postgresql/upgrade/postgresql-upgrade-1.0b20-1.0b21-1.sql
trunk/src/sql/postgresql/upgrade/postgresql-upgrade-1.0b20-1.0b21-2.sql
trunk/src/webapp/WEB-INF/templates/email/notification/IssueActivity.vm
trunk/src/webapp/WEB-INF/templates/email/notification/IssueActivitySubject.vm
trunk/src/webapp/WEB-INF/templates/macros/MITListMacro.vm
trunk/src/webapp/WEB-INF/templates/navigations/CommonLinks.vm
trunk/src/webapp/WEB-INF/templates/screens/AdvancedQuery.vm
trunk/src/webapp/WEB-INF/templates/screens/IssueList.vm
trunk/src/webapp/WEB-INF/templates/screens/IssueTypeList.vm
trunk/src/webapp/WEB-INF/templates/screens/Search.vm
trunk/src/webapp/WEB-INF/templates/screens/admin/ModifyModule.vm
trunk/src/webapp/WEB-INF/templates/viewIssue/ViewIssueTab1.vm
trunk/src/webapp/WEB-INF/templates/viewIssue/ViewIssueTab3.vm
trunk/www/users.html
trunk/xdocs/changes.xml
trunk/xdocs/howto/index.xml
trunk/xdocs/scarab_properties.xml
Log:
Integrated recent changes from release/b21 branch into trunk (via svnmerge)
Modified: trunk/INSTALL
Url: http://scarab.tigris.org/source/browse/scarab/trunk/INSTALL?view=diff&rev=10257&p1=trunk/INSTALL&p2=trunk/INSTALL&r1=10256&r2=10257
==============================================================================
--- trunk/INSTALL (original)
+++ trunk/INSTALL 2006-08-07 15:43:30-0700
@@ -21,12 +21,14 @@
+----------------+--------------------------------------------------
| MySQL | Full support for 4.0 and 4.1
- | PostgreSQL | Full support
+ | PostgreSQL | Full support (*)
| MS SQL Server | partial support [FIXME] what is partial support ?
| Oracle | partial support [FIXME] what is partial support ?
| Hypersonic | partial support [FIXME] what is partial support ?
+----------------+--------------------------------------------------
+(*) See step 5a for more details.
+
,-----------------------------------------------------------------------.
| Step 1: Unpack the Scarab distribution
'-----------------------------------------------------------------------'
@@ -135,6 +137,30 @@
maven -Dskip.seed.data=true scarab:create-db
+*** IMPORTANT information for PostgreSQL users ***
+
+Due to a problem in the database persistence framework we use, Scarab
+will not work "out-of-the-box" with PostgreSQL. Fortunately, there is
+a simple script that you can run which will create a work-around.
+
+This script must be run by a user with sufficient privileges, which
+generally means the user that originally created and initialised the
+PostgreSQL database. Typically this user will be 'postgres'.
+
+The script can be found at src/sql/postgresql/hack-db.sql in the
+distribution, and it can be executed in different ways, for example
+from the command line:
+
+postgres> psql scarab < hack-db.sql
+
+where 'scarab' is the name of the Scarab database, and 'postgres' is
+the "system" postgreSQL user. Alternatively, from the psql interactive
+console:
+
+scarab=> \i hack-db.sql
+
+*** End ***
+
JIRA templates
--------------
Modified: trunk/extensions/scripts/nightly-tarball.sh
Url: http://scarab.tigris.org/source/browse/scarab/trunk/extensions/scripts/nightly-tarball.sh?view=diff&rev=10257&p1=trunk/extensions/scripts/nightly-tarball.sh&p2=trunk/extensions/scripts/nightly-tarball.sh&r1=10256&r2=10257
==============================================================================
--- trunk/extensions/scripts/nightly-tarball.sh (original)
+++ trunk/extensions/scripts/nightly-tarball.sh 2006-08-07 15:43:30-0700
@@ -7,11 +7,12 @@
# Serial number
SERIAL=`date +%Y%m%d`
-# CVS Module name
+# svn Module name and branch
MODULE=scarab
+BRANCH=trunk
# Name for distribution
-TAG=${MODULE}-${SERIAL}
+TAG=${MODULE}-${BRANCH}-${SERIAL}
# Path to public ftp/http directory
PUBDIR=${HOME}/public_html/${MODULE}/nightly
@@ -23,7 +24,7 @@
cd ${PUBDIR}
# Create an exportable directory of the SVN module
-svn export http://${MODULE}.tigris.org/svn/${MODULE}/trunk ${TAG}
+svn export http://${MODULE}.tigris.org/svn/${MODULE}/trunk ${TAG} --username guest --password ""
# Create tarball
tar -c -z --exclude .svn -f ${PUBDIR}/${TAG}.tar.gz ${TAG}
Modified: trunk/maven.xml
Url: http://scarab.tigris.org/source/browse/scarab/trunk/maven.xml?view=diff&rev=10257&p1=trunk/maven.xml&p2=trunk/maven.xml&r1=10256&r2=10257
==============================================================================
--- trunk/maven.xml (original)
+++ trunk/maven.xml 2006-08-07 15:43:30-0700
@@ -46,6 +46,19 @@
<property name="torque.database.password" value="${scarab.database.password}"/>
</ant:ant>
</goal>
+
+
+ <goal name="scarab:migrate-from-b20">
+ <ant:ant antfile="build.xml"
+ target="migrate-from-b20"
+ inheritAll="false"
+ dir="${runtime.config.dir}">
+ <property name="torque.database.driver" value="${scarab.database.jdbc.driver}"/>
+ <property name="torque.database.url" value="${scarab.database.url}"/>
+ <property name="torque.database.user" value="${scarab.database.username}"/>
+ <property name="torque.database.password" value="${scarab.database.password}"/>
+ </ant:ant>
+ </goal>
<goal name="scarab:database">
<ant:echo>
@@ -338,7 +351,16 @@
tofile="target/sql/scarab-schema.sql"/>
<ant:delete file="target/sql/scarab-schema-filtered.sql"/>
</goal>
-
+
+ <preGoal name="war:war">
+ <ant:ant antfile="build.xml"
+ target="create-deployment-directory"
+ inheritAll="false"
+ dir="${root.dir}/build"
+ >
+ </ant:ant>
+ </preGoal>
+
<preGoal name="war:inplace">
<ant:property name="maven.test.skip" value="true"/>
<attainGoal name="eclipse"/>
Modified: trunk/project.properties
Url: http://scarab.tigris.org/source/browse/scarab/trunk/project.properties?view=diff&rev=10257&p1=trunk/project.properties&p2=trunk/project.properties&r1=10256&r2=10257
==============================================================================
--- trunk/project.properties (original)
+++ trunk/project.properties 2006-08-07 15:43:30-0700
@@ -436,6 +436,37 @@
#######################################################################
+# =============
+# Group: module
+# =============
+#
+# scarab.issue.comment.renderer
+#
+
+
+# -----------------------------
+# scarab.issue.comment.renderer
+# -----------------------------
+#
+#
+# Scarab can display issue comments in three ways. Either
+# all comments are simply rendered as plaintext ("plaintext", the default),
+# or they are rendered using a very restricted subset of html ("html")
+# or they are rendered using the wiki syntax of the radeox
+# wiki rendering engine ("radeox"). The used rendering engine
+# can be configured individually for each module from within
+# the module editor. The value given in this property only
+# defines the default engine to be used when it has not yet
+# been defined in the module.
+#
+
+scarab.issue.comment.renderer=plaintext
+
+# ===================
+# End of Group module
+# ===================
+
+
# ============
# Group: email
# ============
@@ -681,6 +712,54 @@
scarab.login.password.expire=30
+
+# ==================
+# Group: NTLM domain
+# ==================
+#
+# scarab.login.ntlm.active
+# scarab.login.ntlm.domain
+#
+# These properties will allow Scarab to try to authenticate users against a
+# NTLM domain (windows network), using credentials provided by the browser.
+#
+# b ships with an empty implementation jar for the JCIFS library. To activate this
+# re you'll need to download the real implementation and replace the shipped jcifs.jar
+# it.
+#
+# an download it from:
+#
+# p://jcifs.samba.org (official site)
+# p://www.ibiblio.org/maven/org.samba.jcifs/jars/jcifs-1.2.6.jar (tested version)
+#
+#
+
+
+# ------------------------
+# scarab.login.ntlm.active
+# ------------------------
+#
+#
+# If set to true, the system will try to authenticate users against an NTLM domain.
+# This property needs scarab.login.ntlm.domain to work.
+#
+
+scarab.login.ntlm.active=false
+
+# ------------------------
+# scarab.login.ntlm.domain
+# ------------------------
+#
+#
+# The name of the NTLM domain to authenticate users, if scarab.login.ntlm.active is TRUE.
+#
+
+scarab.login.ntlm.domain=
+
+# ========================
+# End of Group NTLM domain
+# ========================
+
# -------------------------
# scarab.workflow.classname
# -------------------------
Modified: trunk/project.xml
Url: http://scarab.tigris.org/source/browse/scarab/trunk/project.xml?view=diff&rev=10257&p1=trunk/project.xml&p2=trunk/project.xml&r1=10256&r2=10257
==============================================================================
--- trunk/project.xml (original)
+++ trunk/project.xml 2006-08-07 15:43:30-0700
@@ -901,6 +901,15 @@
</properties>
</dependency>
<dependency>
+ <groupId>org.samba.jcifs</groupId>
+ <artifactId>jcifs</artifactId>
+ <version>1.2.6</version>
+ <type>jar</type>
+ <properties>
+ <war.bundle>true</war.bundle>
+ </properties>
+ </dependency>
+ <dependency>
<!-- Fake dependency, needed for Docbook pdf generation -->
<groupId>jimi</groupId>
<artifactId>jimi</artifactId>
Modified: trunk/src/conf/classes/ScarabBundle_de.properties
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/conf/classes/ScarabBundle_de.properties?view=diff&rev=10257&p1=trunk/src/conf/classes/ScarabBundle_de.properties&p2=trunk/src/conf/classes/ScarabBundle_de.properties&r1=10256&r2=10257
==============================================================================
--- trunk/src/conf/classes/ScarabBundle_de.properties (original)
+++ trunk/src/conf/classes/ScarabBundle_de.properties 2006-08-07 15:43:30-0700
@@ -29,6 +29,7 @@
ViewIssue.vm.Title=Ticket ansehen
ViewIssueLong.vm.Title=Tickets ansehen
IssueTypeList.vm.Title=Liste von Ticket-Typen erzeugen
+QueryMatrix.vm.Title=Übersichtsmatrix
admin/AddPermission.vm.Title=Rechte-Verwaltung
admin/AddRole.vm.Title=Rollen-Verwaltung
@@ -1236,6 +1237,7 @@
CurrentIssueTypeAllModules={0} in allen Modulen
QueryControlViewBy=Suchanfragen, Sicht auf Attribut
AllForAttribute=Alle
+Total=Summe
## ModifyModule
Domain=Domäne
Port=Port
@@ -1409,6 +1411,7 @@
ActivityTypeFailureText=Online Benachrichtigung im Fehlerfall.
ActivityTypeIssueMoved = Ticket verschoben
+ActivityTypeIssueDeleted = Ticket gelöscht
ActivityTypeDependencyChanged = Abhängigkeit geändert
ActivityTypeDependencyCreated = Abhängigkeit erzeugt
ActivityTypeURLAdded = URL hinzugefügt
@@ -2182,7 +2185,7 @@
TransitionsTitle=Übergänge
TransitionsTo=nach
UserCanNotDeleteSelf=Fehler: Sie düfen sich nicht selbst löschen
-UserDeleted=Erfolg: Der Benutzer [{0}] wurde gelöascht
+UserDeleted=Erfolg: Der Benutzer [{0}] wurde gelöscht
UserIsDeleted=Dieser Benutzer wurde gelöscht
ValueSupersedesRequiredIf=(Dieser Wert überschreibt das unten angegebene "Bedingte Pflichtfeld")
Yes=Ja
@@ -2239,4 +2242,4 @@
ActivityDependencies=Änderungen der Abhängigkeiten
ReasonSavedAs=Save reason as
-EnterReasonAs=to be added to this issue when you select Done
\ No newline at end of file
+EnterReasonAs=to be added to this issue when you select Done
Modified: trunk/src/conf/classes/ScarabBundle_en.properties
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/conf/classes/ScarabBundle_en.properties?view=diff&rev=10257&p1=trunk/src/conf/classes/ScarabBundle_en.properties&p2=trunk/src/conf/classes/ScarabBundle_en.properties&r1=10256&r2=10257
==============================================================================
--- trunk/src/conf/classes/ScarabBundle_en.properties (original)
+++ trunk/src/conf/classes/ScarabBundle_en.properties 2006-08-07 15:43:30-0700
@@ -41,6 +41,8 @@
ViewIssue.vm.Title=View issue
ViewIssueLong.vm.Title=View issues
IssueTypeList.vm.Title=Build list of issue types
+QueryMatrix.vm.Title=Issue overview
+
CreatedBy=Created by
CreatedDate=Creation date
ModifiedBy=Last modified by
@@ -1223,6 +1225,7 @@
UserIsNotConfirmed=User is not confirmed!
YourPasswordHasExpired=Your password has expired.
UserIsDeleted=This user has been deleted.
+AutomaticallyLoggedIn = You've been logged in as user "{0}" in the "{1}" domain.
##Logout
YouHaveBeenLoggedOut=You have been logged out
@@ -1306,6 +1309,7 @@
CurrentIssueTypeAllModules={0} in all modules
QueryControlViewBy=Query control, view by attribute
AllForAttribute=All
+Total=total
## ModifyModule
Domain=Domain
Port=Port
@@ -2268,4 +2272,4 @@
ActivityDependencies=Dependency changes
ReasonSavedAs=Save reason as
-EnterReasonAs=to be added to this issue when you select Done
\ No newline at end of file
+EnterReasonAs=to be added to this issue when you select Done
Modified: trunk/src/conf/classes/ScarabBundle_es.properties
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/conf/classes/ScarabBundle_es.properties?view=diff&rev=10257&p1=trunk/src/conf/classes/ScarabBundle_es.properties&p2=trunk/src/conf/classes/ScarabBundle_es.properties&r1=10256&r2=10257
==============================================================================
--- trunk/src/conf/classes/ScarabBundle_es.properties (original)
+++ trunk/src/conf/classes/ScarabBundle_es.properties 2006-08-07 15:43:30-0700
@@ -1196,6 +1196,7 @@
UserIsNotConfirmed = Usuario no confirmado!
YourPasswordHasExpired = Tu contraseña ha expirado.
UserIsDeleted = Este usuario ha sido borrado
+AutomaticallyLoggedIn = Has sido conectado como usuario "{0}" en el dominio "{1}".
##Logout
YouHaveBeenLoggedOut = You have been logged out
Modified: trunk/src/conf/classes/ScarabBundle_zh_TW.properties
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/conf/classes/ScarabBundle_zh_TW.properties?view=diff&rev=10257&p1=trunk/src/conf/classes/ScarabBundle_zh_TW.properties&p2=trunk/src/conf/classes/ScarabBundle_zh_TW.properties&r1=10256&r2=10257
==============================================================================
--- trunk/src/conf/classes/ScarabBundle_zh_TW.properties (original)
+++ trunk/src/conf/classes/ScarabBundle_zh_TW.properties 2006-08-07 15:43:30-0700
@@ -25,7 +25,7 @@
IssueList.vm.Title=\u67e5\u8a62\u7d50\u679c
IssueList.vm.TitleWithQueryName=\u67e5\u8a62\u7d50\u679c [{0}]
Login.vm.Title=\u6b61\u8fce\u4f7f\u7528 Scarab
-ModuleNotReady.vm.Title=Module not ready
+ModuleNotReady.vm.Title=\u672a\u555f\u7528\u6a21\u7d44
QueryList.vm.Title=\u5df2\u5132\u5b58\u7684\u67e5\u8a62\u6e05\u55ae
Register.vm.Title=\u8a3b\u518a
RegisterConfirm.vm.Title=\u78ba\u8a8d\u65b0\u5e33\u865f\u7684\u8cc7\u8a0a
@@ -55,23 +55,23 @@
admin/DeleteUser.vm.Title=\u4f7f\u7528\u8005\u7ba1\u7406
admin/EditRole.vm.Title=\u89d2\u8272\u7ba1\u7406
admin/EditUser.vm.Title=\u4f7f\u7528\u8005\u7ba1\u7406
-admin/EditUserRoles.vm.Title=User/Role administration
-admin/GlobalArtifactTypeEdit.vm.Title=Global issue type edit
-admin/GlobalArtifactTypeShow.vm.Title=Global issue types
-admin/GlobalAttributeGroupEdit.vm.Title=Global attribute group
-admin/GlobalAttributeEdit.vm.Title=Global attributes
-admin/GlobalAttributeShow.vm.Title=Global attributes
-admin/GlobalUserAttributes.vm.Title=Global user attributes
-admin/GlobalUserAttributeSelect.vm.Title=Select user attribute
-admin/GlobalAttributeSelect.vm.Title=Select attribute
-admin/IssueTypeAttributeEdit.vm.Title=Issue type attribute editor
-admin/ManageArtifactTypes.vm.Title=Manage issue types
-admin/ManageModules.vm.Title=Manage modules
-admin/ManagePermissions.vm.Title=Permission administration
-admin/ManageRoles.vm.Title=Role administration
-admin/ManageUserSearch.vm.Title=User search
-admin/ModifyModule.vm.Title=Module editor
-admin/ModuleAttributeEdit.vm.Title=Module attribute editor
+admin/EditUserRoles.vm.Title=\u4f7f\u7528\u8005/\u7e73\u8272\u7ba1\u7406
+admin/GlobalArtifactTypeEdit.vm.Title=\u7cfb\u7d71\u5171\u7528\u8b70\u984c\u7a2e\u985e\u7de8\u8f2f
+admin/GlobalArtifactTypeShow.vm.Title=\u7cfb\u7d71\u5171\u7528\u8b70\u984c\u7a2e\u985e
+admin/GlobalAttributeGroupEdit.vm.Title=\u7cfb\u7d71\u5171\u7528\u5c6c\u6027\u7fa4\u7d44
+admin/GlobalAttributeEdit.vm.Title=\u7cfb\u7d71\u5171\u7528\u5c6c\u6027
+admin/GlobalAttributeShow.vm.Title=\u7cfb\u7d71\u5171\u7528\u5c6c\u6027
+admin/GlobalUserAttributes.vm.Title=\u7cfb\u7d71\u5171\u7528\u4f7f\u7528\u8005\u5c6c\u6027
+admin/GlobalUserAttributeSelect.vm.Title=\u9078\u64c7\u4f7f\u7528\u8005\u5c6c\u6027
+admin/GlobalAttributeSelect.vm.Title=\u9078\u64c7\u5c6c\u6027
+admin/IssueTypeAttributeEdit.vm.Title=\u8b70\u984c\u7a2e\u985e\u5c6c\u6027\u7de8\u8f2f
+admin/ManageArtifactTypes.vm.Title=\u5c6c\u6027\u7a2e\u985e\u7ba1\u7406
+admin/ManageModules.vm.Title=\u6a21\u7d44\u7ba1\u7406
+admin/ManagePermissions.vm.Title=\u6b0a\u9650\u7ba1\u7406
+admin/ManageRoles.vm.Title=\u89d2\u8272\u7ba1\u7406
+admin/ManageUserSearch.vm.Title=\u4f7f\u7528\u8005\u641c\u5c0b
+admin/ModifyModule.vm.Title=\u6a21\u7d44\u7de8\u8f2f
+admin/ModuleAttributeEdit.vm.Title=\u6a21\u7d44\u5c6c\u6027\u7de8\u8f2f
admin/ConditionEdit.vm.Title=Condition editor
admin/SetInfoMessage.vm.Title=Set default informational message
admin/UserAttributeEdit.vm.Title=User attribute editor
@@ -116,7 +116,7 @@
## Internationalization strings
RequiredFields=indicates required fields
-Name=\u540d\u5b57
+Name=\u540d\u7a31
User=\u4f7f\u7528\u8005
AccountStatus=\u5e33\u865f\u72c0\u614b
Description=\u6558\u8ff0
@@ -124,8 +124,8 @@
FirstName=\u540d
LastName=\u59d3
FullName=\u5168\u540d
-Username=\u4eba\u54e1\u59d3\u540d
-Association=Association
+Username=\u767b\u5165\u5e33\u865f
+Association=\u95dc\u806f
Availability=Availability
Location=\u5730\u5340
CreatedBy=\u7522\u751f\u8005
@@ -140,7 +140,7 @@
IssueIDRangeNotValid=ID range "{0}" not valid
IssueIDPrefixesDoNotMatch=ID prefixes "{0}" and "{1}" do not match
IssueType=\u8b70\u984c\u7a2e\u985e
-Select=Select
+Select=\u9078\u64c7
ID=ID
NewUsers=\u65b0\u4f7f\u7528\u8005
Summary=\u7e3d\u7d50
@@ -167,7 +167,7 @@
AllPublicModules=public Modules ...
Module=\u6a21\u7d44
CapModule=\u6a21\u7d44
-ToAccessPage=To access this page, you must first
+ToAccessPage=\u6b32\u5b58\u53d6\u6b64\u9801\uff0c\u60a8\u5fc5\u9808\u5148
Role=\u89d2\u8272
New=New
Locked=\u9396\u5b9a
@@ -175,11 +175,11 @@
Code=Code
Dots=...
Previous=Previous
-Note=Note:
-Notes=Notes
-Notelc=note
+Note=\u6ce8\u610f:
+Notes=\u6ce8\u610f\u4e8b\u9805
+Notelc=\u6ce8\u610f\u4e8b\u9805
Pound=#
-All=All
+All=\u5168\u90e8
YearMark=
MonthMark=
DayMark=
@@ -203,8 +203,8 @@
Creation=Creation
Notification=Notification
GeneralInformation=General Information
-MailModifiedBy=Modified by
-MailCreatedBy=Created by
+MailModifiedBy=\u4fee\u6539\u8005
+MailCreatedBy=\u5efa\u7acb\u8005
ScarabLink=Scarab Link
ReasonForCreation=Reason for creation
@@ -212,12 +212,12 @@
Filter=Filter
AssociateSelectedUserWithIssue=Associate selected users with issue
Submit=\u63d0\u4ea4
-Add=Add
-AddNew=Add new
+Add=\u52a0\u5165
+AddNew=\u65b0\u589e
AddNewChild=Add new child
-AddAttachment=Add attachment
+AddAttachment=\u52a0\u5165\u9644\u4ef6
AddDependencyButton=Add dependency
-AddUrlButton=Add related link
+AddUrlButton=\u52a0\u5165\u76f8\u95dc\u9023\u7d50
SaveModifiedUrl=Save modified link(s)
SaveModifiedDep=Save modified dependencies
AddCommentToSelected=Add comment to selected
@@ -233,17 +233,17 @@
PaginateNext=Next »
Next=Next
ClearForm=Clear form
-CopySelected=Copy selected
-Delete=Delete
-DeleteSelected=Delete selected
-DeleteUndeleteSelected=Delete/Undelete selected
-UndeleteSelected=Un-delete selected
-DeleteAttachment=Delete selected attachment(s)
+CopySelected=\u8907\u88fd\u6240\u9078
+Delete=\u522a\u9664
+DeleteSelected=\u522a\u9664\u6240\u9078
+DeleteUndeleteSelected=\u522a\u9664/\u5fa9\u539f\u6240\u9078
+UndeleteSelected=\u5fa9\u539f\u6240\u9078
+DeleteAttachment=\u522a\u9664\u6240\u9078\u9644\u4ef6
DeleteDependency=Delete selected dependencies
-DeleteUrls=Delete selected link(s)
+DeleteUrls=\u522a\u9664\u6240\u9078\u9023\u7d50
CreateNewQuery=\u7522\u751f\u65b0\u67e5\u8a62\u689d\u4ef6
SaveQuery=\u5132\u5b58\u6b64\u67e5\u8a62\u689d\u4ef6
-RefineQuery=Refine query
+RefineQuery=\u4fee\u98fe\u67e5\u8a62\u689d\u4ef6
Resort=Resort
Reset=Reset
RemoveSelectedAssignee=Remove selected from assignee list
@@ -253,51 +253,51 @@
ResendCode=Resend code
ExecuteQuery=Execute query
RevokeSubscription=Revoke subscription
-EmailNewPassword=Email new password
-Assign=Assign
-UseTemplate=Use template
-CreateNew=Create new
-Edit=Edit
+EmailNewPassword=Email \u65b0\u5bc6\u78bc
+Assign=\u6307\u6d3e
+UseTemplate=\u4f7f\u7528\u6a23\u677f
+CreateNew=\u65b0\u5efa
+Edit=\u7de8\u8f2f
Search=\u641c\u5c0b
-AddUser=Add user
-EditRoles=Edit roles
-DeleteUser=Delete user
-Create=Create
-AddSelectedToModule=Add selected to module
-AddSelectedToIssueType=Add selected to issue type
+AddUser=\u589e\u52a0\u4eba\u54e1
+EditRoles=\u7de8\u8f2f\u89d2\u8272
+DeleteUser=\u522a\u9664\u4f7f\u7528\u8005
+Create=\u65b0\u5efa
+AddSelectedToModule=\u5c07\u6240\u9078\u9805\u76ee\u52a0\u5165\u6a21\u7d44
+AddSelectedToIssueType=\u5c07\u6240\u9078\u9805\u76ee\u52a0\u5165\u8b70\u984c\u7a2e\u985e
Go=Go
EditList=Edit list
UpdateOptions=Update options
CopyIssue=\u8907\u88fd\u8b70\u984c
-MoveIssue=Move issue
+MoveIssue=\u642c\u79fb\u8b70\u984c
EditComment=\u7de8\u8f2f\u8a3b\u89e3
SaveComment=\u5132\u5b58\u7570\u52d5\u904e\u7684\u8a3b\u89e3
ContinueEntry=Continue entry
SubmitIssue=\u63d0\u4ea4\u8b70\u984c
-AddSelected=Add selected
+AddSelected=\u52a0\u5165\u6240\u9078
RemoveSelected=\u79fb\u9664\u6240\u9078
-UpdateSelected=Update selected
-RemoveAll=Remove all
-Continue=Continue
-SubmitNote=Submit note only
-NoItemsSelected=No
+UpdateSelected=\u7570\u52d5\u6240\u9078
+RemoveAll=\u79fb\u9664\u5168\u90e8
+Continue=\u7e7c\u7e8c
+SubmitNote=\u53ea\u63d0\u4ea4\u6ce8\u610f\u4e8b\u9805
+NoItemsSelected=\u7121
## Templates
-Templates=Templates
-EditTemplates=Edit templates
+Templates=\u6a23\u677f
+EditTemplates=\u7de8\u8f2f\u6a23\u677f
NoTemplates=There are no stored templates, click the "Create new" button to create a new template.
-TemplateInfo=Template information
-TemplateAttributes=Template Attributes
+TemplateInfo=\u6a23\u677f\u8cc7\u8a0a
+TemplateAttributes=\u6a23\u677f\u5c6c\u6027
CouldNotLocateTemplateToDelete=Could not locate template to delete
TemplateWarning=Note: if you set this template's scope to global, you will no longer be able to edit it. Please finish making all modifications to the template before you click "Save".
-DuplicateTemplateName=A template by this name already exists.
+DuplicateTemplateName=\u5df2\u5b58\u5728\u540c\u540d\u6a23\u677f.
AtLeastOneAttributeForTemplate=You must set a value for at least one attribute to create a new template.
##Index/Login
ToAccessFunctions1=To access most functions in Scarab, you must first
ToAccessFunctions2=Some function may not require you to login first. A list of those functions will be provided in the future.
IfYouAreNotRegistered=If you are not a registered user, please <a href="{0}"><strong>create an account</strong></a>.
-SelectModule1=Select a
+SelectModule1=Select a
SelectModule2=A module is the unit of work space representing a unique set of "issue types" (issues). Each new module also has the following unique details:
SetOfUsers=a set of users
SetOfRoles=a set of roles
@@ -305,29 +305,29 @@
ScarabUsesGenericTerm=Scarab uses the generic term "module" instead of the more common term, "project", in order to avoid defining the application as simply a "per project-issue management tool". Scarab can be configured to manage cross-project data such as milestones, technical requirements, marketing data, or human resources information.
NoModuleAccess=If you are a registered user, but do not have access to any modules, contact the administrator.
SelectIssueType1=Select an
-SelectIssueType2=issue type
+SelectIssueType2=\u8b70\u984c\u7a2e\u985e
SelectIssueType3=from the search bar navigation. An issue type encapsulates a unique set of attributes and attribute options:
SetOfAttributes=a customizable set of attributes
SetOfOptions=a customizable set of options (per attribute)
SetOfPermissionsPerRole=a unique set of permissions per role
OnceYouSelectIssueType=Once you select an issue type, Scarab's navigation will indicate your selection state by dropping down a list of functions within that issue type, giving you access to functionality such as:
-EnterANewIssue=enter a new issue
-QueryTheDatabase=query the database
+EnterANewIssue=\u8f38\u5165\u65b0\u8b70\u984c
+QueryTheDatabase=\u67e5\u8a62\u8cc7\u6599\u5eab
RunReports=run reports on database activity
YourInputRemains=Your input will remain confined to the selected issue type until you select another issue type from the navigation bar or from the issue type index.
##Register
-Registration=Registration
+Registration=\u8a3b\u518a
EnterValidEmailAddress=Enter your valid email address - including your "@serviceprovider" domain. For example, if your AOL screen name is joecool, your email address is [email protected]. If you enter an invalid email address, you will not be able to log in and use the system.
UserNameCanBe=For convenience, your user name can be the same as your email address.
-ErrorLocatingInfo=There has been an error locating the required information. Please go back to the
+ErrorLocatingInfo=There has been an error locating the required information. Please go back to the
ErrorLocatingInfo2=page and try again.
ConfirmAccuracy=Please confirm that the information below is accurate, then click the "Confirm registration" button. An email containing instructions for completing your registration will be sent to the email address listed below. If you entered an invalid email address, please click your web browser's back button and enter a valid email address. You will not be able to log into the system if the confirmation email cannot be sent to you.
-Confirmation=Confirmation
-ConfirmationSubject=Account confirmation
-ConfirmationCode=Confirmation code
-ConfirmationInformation=Confirmation information
-UserObjectNotInSession=Unable to retrieve user object from session.
+Confirmation=\u78ba\u8a8d
+ConfirmationSubject=\u5e33\u865f\u78ba\u8a8d
+ConfirmationCode=\u78ba\u8a8d\u4ee3\u78bc
+ConfirmationInformation=\u78ba\u8a8d\u8cc7\u8a0a
+UserObjectNotInSession=\u7121\u6cd5\u5f9e session \u4e2d\u53d6\u5f97\u4f7f\u7528\u8005\u7269\u4ef6.
RegisterSessionError=Sorry! There is an error in your session. Please close your browser and start over.
RegisterGroupIsNullError=Register group is null, please report this error.
UsernameGroupIsNullError=Username field is null, please report this error.
@@ -344,15 +344,15 @@
ForgotPasswordEmailSubject=Scarab account password
## Enter/View issue
-ViewIssue=View issue
+ViewIssue=\u6aa2\u8996\u8b70\u984c
EnterNewIssue=\u8f38\u5165\u65b0\u8b70\u984c
-EnterNewIssueType=Enter new {0}
+EnterNewIssueType=\u8f38\u5165\u65b0\u8b70\u984c\u7a2e\u985e {0}
EnterNewBriefInstructions=Click the issue type name to enter a new issue from scratch or select a template.
DefaultText=Default text attribute is used when more distinguishing information than the issue ID is needed. It is used in emails after an issue is entered, for example.
StaticIssueInfo=\u8b70\u984c\u8cc7\u8a0a
ReasonForChange=\u7570\u52d5\u4e8b\u7531
EnterReason=This text will be added to this issue as a Reason for change when you select <strong>Done</strong>
-AssociatedPersonnel=Personnel associated with issue
+AssociatedPersonnel=\u6b64\u8b70\u984c\u76f8\u95dc\u4eba\u54e1
ParenDisabled=(disabled)
Comments=\u5099\u8a3b
IssueComments={0} \u5099\u8a3b
@@ -364,8 +364,8 @@
RelatedLinks=\u76f8\u95dc\u9023\u7d50
AddAttachmentTitle=\u52a0\u5165\u9644\u4ef6
AddDependencyTitle=Add Dependency
-AddRelatedLinkTitle=Add Related Link
-NoChangesMade=No changes were made which need to be saved.
+AddRelatedLinkTitle=\u52a0\u5165\u76f8\u95dc\u9023\u7d50
+NoChangesMade=\u6240\u8981\u5132\u5b58\u7684\u9805\u76ee\u6c92\u6709\u4efb\u4f55\u7570\u52d5
URL=URL
Attachments=\u9644\u4ef6
CouldNotFindActivitySet=Could not find initial activity set for this issue;
@@ -389,7 +389,7 @@
Parent=Parent
Child=Child
PrivateIssue=\u79c1\u4eba\u8b70\u984c
-Relationship=Relationship
+Relationship=\u95dc\u4fc2
ChangeHistory=\u8b8a\u66f4\u6b77\u7a0b
DateStamp=\u65e5\u671f\u6233\u8a18
InitialEntry=Initial entry
@@ -400,15 +400,15 @@
ViewIssueInDifferentModule=You are viewing an issue in a different module ({0}) than is currently selected.
AttachmentsURLs={0} \u9644\u4ef6/ {1} URLs
DependenciesTab={0} Dependencies
-Personnel=Personnel
-PersonnelTab= {0} Personnel
+Personnel=\u4eba\u54e1
+PersonnelTab= {0} \u4eba\u54e1
SessionInfoLink=Session-info-free link to
PleaseEnterNewIssueId=\u8acb\u8f38\u5165\u65b0\u8b70\u984cID.
PleaseEnterIssueID=\u8acb\u8f38\u5165\u8b70\u984cID.
NoPermissionToViewIssue=You do not have permission to view an issue with that ID. If you believe it is a valid ID, check with the project owner or system administrator.
History=\u6b77\u7a0b
IssueSearchResults=\u8b70\u984c\u641c\u5c0b\u7d50\u679c
-IssueLimitExceeded=Please select not more than {0} issues.
+IssueLimitExceeded=\u8acb\u52ff\u9078\u8d85\u904e {0} \u8b70\u984c.
ChooseDependencyType=Choose dependency type
HideCommentList=\u96b1\u85cf\u5b8c\u6574\u7684\u5099\u8a3b\u6e05\u55ae
ShowCommentList=\u986f\u793a\u5b8c\u6574\u7684\u5099\u8a3b\u6e05\u55ae
@@ -417,7 +417,7 @@
NoAttributesDefinedForTemplate=There are no attributes defined for the issue type "{0}". It is not possible to create a new template until attributes have been defined.
ApplyTemplate=Apply a {0} template
ViewAllTemplates=View all my {0} templates
-NewIssue=New {0}
+NewIssue=\u65b0\u8b70\u984c {0}
PossibleDuplicates=Possible duplicates
DateClosed=Date closed
AttachmentFieldRequired=attachment fields are only required if the {0} is set
@@ -429,8 +429,8 @@
MissedRequired2=Please supply a short description which will be useful for users receiving the new issue email. Also any information that did not fit within one of the attributes shown above can be added here.
IssueTypesInProject=\u76ee\u524d\u6a21\u7d44\u7684\u8b70\u984c\u7a2e\u985e
IssueEntryComment=\u5099\u8a3b
-NotProvided=Not provided.
-IssueListCount=({0} issue(s) found)
+NotProvided=\u672a\u63d0\u4f9b.
+IssueListCount=(\u627e\u5230 {0} \u8b70\u984c)
PatchFile=Patch file (text/plain, diffs)
PlainText=Plain text (text/plain)
HTMLSource=HTML source (text/html)
@@ -443,27 +443,27 @@
ZipFormat=Zip compressed data (application/x-zip-compressed)
GZipFormat=GZIP compressed data (application/x-gzip)
GenericBinary=Generic binary file (application/octet-stream)
-ViewAsTabs=View as tabs
-ViewAsSingleScreen=View as single screen
-UserAttributesInThisIssueType=User attributes in this issue type
+ViewAsTabs=\u4ee5\u9801\u7c64\u65b9\u5f0f\u986f\u793a
+ViewAsSingleScreen=\u5728\u540c\u4e00\u500b\u756b\u9762\u986f\u793a
+UserAttributesInThisIssueType=\u6b64\u8b70\u984c\u7a2e\u985e\u7684\u4f7f\u7528\u8005\u5c6c\u6027
## AssignIssue
AssignUsersWithThisIssue=Associate users with {0,choice,1#this issue|2#these issues}
NoAssignableUserAttributes=There are no active user attributes to which to assign users.
-AssociateUsersAndIssues=Please select an issue or issues with which to associate users.
+AssociateUsersAndIssues=\u8acb\u9078\u64c7\u8b70\u984c\u4e88\u76f8\u95dc\u4eba\u54e1.
ClickHereToSelectUsers=<a href="#add">Click here</a> to select users to associate with {0,choice,1#this issue|2#these issues}
ChangesSavedOnDone=Changes are not saved to the issue until you select "Done"
-PersonnelAssociatedWithIssue=Personnel associated with the issue {0}
-IssueIdNotValid=The issue ID, {0}, is not valid.
+PersonnelAssociatedWithIssue=\u6b64\u8b70\u984c\u76f8\u95dc\u4eba\u54e1 {0}
+IssueIdNotValid=\u6b64\u8b70\u984c ID {0} \u662f\u7121\u6548\u7684.
PossibleUsers=\u5019\u9078\u4eba\u54e1
FilterThisList=Filter this list
NoUsersMatch=No users match your criteria. Displaying full user list.
-SelectedUsersWereAdded=Selected users were added.
+SelectedUsersWereAdded=\u6240\u9078\u4eba\u54e1\u5df2\u52a0\u5165.
SelectedUsersWereRemoved=\u6240\u9078\u4eba\u54e1\u5df2\u79fb\u9664
SelectedUsersWereModified=\u6240\u9078\u4eba\u54e1\u5df2\u7570\u52d5
NoUsersSelected=\u5c1a\u672a\u9078\u64c7\u4efb\u4f55\u4eba\u54e1
NoUserAttributesInCommon=The selected modules have no user attributes in common.
-NoUsersAvailable=There are no users available.
+NoUsersAvailable=\u7121\u4efb\u4f55\u53ef\u7528\u4eba\u54e1.
##Password
ChangePassword=\u8b8a\u66f4\u5bc6\u78bc
@@ -484,34 +484,34 @@
##SelectModule
RequestRolesInOtherModules=to access other modules.
-CurrentModule=Currently selected module
+CurrentModule=\u76ee\u524d\u6240\u9078\u6a21\u7d44
YouCannotAccessModules=Sorry, you do not have access to select any other modules. Please <a href="{0}">Login</a> with an account that has permissions to select a Module.
##RequestRoles
-RequestRoles=Request roles
+RequestRoles=\u7533\u8acb\u89d2\u8272
##Search
AdvancedQuery=\u9032\u968e\u67e5\u8a62
CustomQuery=\u5ba2\u88fd\u67e5\u8a62
NoCustomSearch=There are no custom search attributes designated for this artifact type, so the advanced query screen is being shown instead.
ClickHereToSelectUsersForQuery=<a href="#add">Click here</a> to select users to associate with this query.
-TextSearch=Text search
-SearchAll=Search all
-EnterString=Enter search string
+TextSearch=\u5168\u6587\u6aa2\u7d22
+SearchAll=\u5168\u9078
+EnterString=\u8f38\u5165\u6b32\u67e5\u8a62\u7684\u5b57\u4e32Enter search string
MultiChoiceSearch=Multiple/single choice search
Ascending=Ascending
Descending=Descending
-IssuesPerPage=Issues per page
+IssuesPerPage=\u6bcf\u9801\u986f\u793a\u8b70\u984c\u6578
Documentation=documentation
UserSearchOr=<strong>Note:</strong> Query results will include artifacts associated with any of the users listed below.
SelectTextAttributes=Select text attributes
-ViewAll=View all
-ViewSelected=View selected
-AssignAll=Assign all
-AssignSelected=Assign selected
-CopyAll=Copy all
-MoveAll=Move all
-MoveSelected=Move selected
+ViewAll=\u6aa2\u8996\u5168\u90e8
+ViewSelected=\u6aa2\u8996\u6240\u9078
+AssignAll=\u6307\u6d3e\u5168\u90e8
+AssignSelected=\u6307\u6d3e\u6240\u9078
+CopyAll=\u8907\u88fd\u5168\u90e8
+MoveAll=\u642c\u79fb\u5168\u90e8
+MoveSelected=\u642c\u79fb\u6240\u9078
IssueTypeListMoreThanOne=Issue type list did not contain one and only one element.
NoIssueTypeList=Lost track of the selected issue type(s).
@@ -537,7 +537,7 @@
AttributesThatDoNotExist=Attributes that do not map to destination issue type (saved as comment)
IncludedAsComment=Selected attributes / values will be included in destination issue as comment text.
CopyChangeHistory=This information will be added to the change history entry for both the original issue, and the destination issue.
-Value=Value
+Value=Value
Include=Include
OptionName=Option name
MovedIssueNote=Moved issue note
@@ -554,7 +554,7 @@
##IssueList
ExportResultsTo=Export results to:
-NoMatchingIssues=There are no matching issues.
+NoMatchingIssues=There are no matching issues.
AddRemoreAttributesFromView=Add/remove attributes from view
NoCommonAttributesInList=The issue types selected for the query have no attributes in common
SortDescending=sort descending
@@ -628,22 +628,22 @@
StateChangeQuery=State change query
StateChangeOldEqualNew=The same option is not allowed for both old and new state change values
ResultPrefs=Search results view preferences
-Any=Any
-AnyValue=Any value
+Any=\u4efb\u610f
+AnyValue=\u4efb\u610f\u503c
Choose=Choose...
-SortBy=Sort by
+SortBy=\u6392\u5e8f\u4f9d\u64da
ModuleQuery=Module query
BuildXModuleQuery=Build cross module query
IssueTypesInModuleAndSavedLists=Issue types in this module and saved lists
QuerySelected=Query selected
QuerySelectedDesc=query fields shared by selected issue types
-AllIssues=All issues
+AllIssues=\u6240\u6709\u7684\u8b70\u984c
AllIssuesDesc=generates a list of all issues within the selected issue types
-MyIssues=My issues
-MyIssuesThisModule=My issues in this module
-MyIssuesAllModules=My issues (all modules)
+MyIssues=\u6211\u7684\u8b70\u984c
+MyIssuesThisModule=\u76ee\u524d\u6a21\u7d44\u4e2d\u7684\u6211\u7684\u8b70\u984c
+MyIssuesAllModules=\u6211\u7684\u8b70\u984c (\u6240\u6709\u6a21\u7d44)
MyIssuesDesc=generates a list of all issues associated with the logged in user
-AllIssueTypesInModule=All issue types in {0}
+AllIssueTypesInModule=\u5728 {0} \u7684\u6240\u6709\u8b70\u984c\u7a2e\u985e
QueryAllIssueTypes=Query all issue types in this list
ThereAreMoreComments={0} more comments
QueryWarning=Note: if you set this query's scope to global, you will no longer be able to edit it. Please finish making all modifications to the query before you click "Save".
@@ -673,7 +673,7 @@
NumberOfIssues=Number of issues
EnteringListWillOverwrite=Entering a previously saved list's name will overwrite the old list.
EditingPreviouslySaved=Editing a previously saved list is not implemented.
-CurrentModuleTypesIntroShown=The current module is separated for convenient access. Issue types in this section can be combined with those in other modules from the following section.
+CurrentModuleTypesIntroShown=The current module is separated for convenient access. Issue types in this section can be combined with those in other modules from the following section.
HideThisSection=<a href="{0}">Hide this section</a>
CurrentModuleTypesIntroHidden=Issue types in the current module. <a href="{0}">Click here</a> to create a cross module list.
@@ -688,19 +688,19 @@
NoErrorMessage=Sorry, there was no error message. \n Although, one common source of the error could be a result of not being able \n to find the requested template. Please try going back to the \n {0} screen and starting over.
## Reports
-Update=Update
-Group=Group
-Personal=personal
+Update=\u7570\u52d5
+Group=\u7fa4\u7d44
+Personal=\u500b\u4eba
ReportBuilder=Report builder
MustSelectReport=You must select a report.
ReportInformation=Report information
ConfineDataset=Confine dataset
-Content=Content
-Row = Row
-Column = Column
-RowContent=Row content
-ColumnContent=Column content
-RecalculateOutput=Generate report
+Content=\u5167\u5bb9
+Row = \u5217
+Column = \u6b04
+RowContent=\u5217\u7684\u5167\u5bb9
+ColumnContent=\u6b04\u4f4d\u5167\u5bb9
+RecalculateOutput=\u7522\u751f\u5831\u8868
RowCriteria=Row criteria
ColumnCriteria=Column criteria
Headings=Headings
@@ -787,7 +787,7 @@
ColumnType=Columns: content types
SelectRowContent=Select row/column content
GenerateReport=Generate report
-NoCategoryChosen=No category was chosen. Please check the URL and try again.
+NoCategoryChosen=No category was chosen. Please check the URL and try again.
ReportContentRate=Report content: Rate of change analysis
ColumnDate=Columns: date(s)
AddedNext=Added during next step
@@ -842,33 +842,33 @@
ItemAlreadyApproved=Item "{0}" has already been approved by another user.
ItemAlreadyRejected=Item "{0}" has already been rejected by another user.
ReadOnlyViewOfQuery=The query below is presented for review purposes only. Do not attempt to make modifications and after inspecting the query click "Cancel" to return to the approval screen.
-AddPermission=Add permissions
-Permission=Permission
-AddRole=Add role
-AddNewUser=Add new user
-RegisterNewUser =Register
-NotRegistered =Not registered?
-GlobalData=Global data
+AddPermission=\u65b0\u589e\u6b0a\u9650
+Permission=\u6b0a\u9650
+AddRole=\u65b0\u589e\u89d2\u8272
+AddNewUser=\u65b0\u589e\u65b0\u4f7f\u7528\u8005
+RegisterNewUser =\u65b0\u4f7f\u7528\u8005\u8a3b\u518a
+NotRegistered =\u5c1a\u672a\u8a3b\u518a?
+GlobalData=\u7cfb\u7d71\u5171\u7528\u8cc7\u6599
GlobalIssueTypes=Global issue types
GlobalAttributes=Global attributes
UpdateSearchIndex=Update search index
UpdateSearchIndexBody=Click the "Update search index" button below to re-create the Lucene search indexes in case they have been corrupted or lost. When you click the button below, the page will continue to refresh until the index is done updating. This can be a very resource intensive process, so please perform this action with caution and please do not stop this process until it is complete.
-Approve=Approve
-Modules=Modules
-AdminManageIssueTypes=Manage issue types
-ManageModules=Manage modules
+Approve=\u6838\u53ef
+Modules=\u6a21\u7d44
+AdminManageIssueTypes=\u8b70\u984c\u7a2e\u985e\u7ba1\u7406
+ManageModules=\u6a21\u7d44\u7ba1\u7406
XMLImport=XML import
XMLExport=XML export
Roles=Roles
RoleList=Role list
-AddNewRole=Add new role
-UserManagement=User management
+AddNewRole=\u65b0\u589e\u89d2\u8272
+UserManagement=\u4f7f\u7528\u8005\u7ba1\u7406
OpenSubmissions=Open submissions
SubmittedBy=Submitted by
ApproveRoleRequests=Approve role requests
NoAction=No action
CommentOnly=Comment only
-Reject=Reject
+Reject=\u99c1\u56de
Defer=Defer
Deny=Deny
Query=Query
@@ -988,7 +988,7 @@
ExportAsDownloadable=Export as downloadable file
ExportToBrowser=Export to browser window
ExportUserInfo=Export user information
-SaveDownloadedAs=Save downloaded file as...
+SaveDownloadedAs=Save downloaded file as...
Export=Export
SpecifyACommaSepparatedList=Specify a comma separated list of issues and/or issue ranges. A range is a starting issue followed by a "-" and finally the end issue. It is also possible to specify a * to export all issues in the module. Please note that using * can be very resource intensive if there is a large number of issues. Example: PACS1-PACS5, PACS10, 20. Note: For security reasons, it is only possible to export issues from the currently selected module.
Issues=Issues
@@ -1000,7 +1000,7 @@
##XMLImportResults
ImportResults=Artifact import results
-Overall=Import result:
+Overall=Import result:
NoErrors=No errors.
NumAffected=Number of issues affected
IDsAffected=IDs of affected issues
@@ -1063,11 +1063,11 @@
## Email Configuration
EmailConfiguration=Email configuration
EmailEnable=Enable email
-EmailEnableDescription=Check to have activity generate email
+EmailEnableDescription=Check to have activity generate email
EmailIncludeIssueDetails=Include issue details
EmailIncludeIssueDetailsDescription=If unchecked, emails will only contain a link to the issue.
EmailAllowModuleOverride=Allow module overrides
-EmailAllowModuleOverrideDescription=Allow modules to override the above settings.
+EmailAllowModuleOverrideDescription=Allow modules to override the above settings.
## Emails
Welcome=Welcome {0} {1},
@@ -1169,7 +1169,7 @@
CannotPositionDuplicateCheckFirst=The duplicate check cannot be at the beginning.
DuplicateSequenceNumbersFound=Please do not enter duplicate sequence numbers for {0}.
-## GlobalArtifactTypes
+## GlobalArtifactTypes
ChangesResultDuplicateNames=Changes would result in duplicate names
Duplicate=Duplicate
GlobalIssueTypesDeleted=Global issue type(s) deleted.
@@ -1185,7 +1185,7 @@
CannotCreateDuplicateAttribute=Cannot create a duplicate Attribute with the same name.
RecursiveParentChildRelationship=Sorry, a recursive Parent Child relationship is not allowed!
AttributeOptionAdded=The attribute option has been added.
-AttributeAdded=The attribute has been added.
+AttributeAdded=The attribute has been added.
TypeCannotChange=Type cannot be changed once issues are entered using the attribute
CannotCreateDuplicateOption=Cannot create a duplicate Attribute Option with the same name.
CannotCreateChild=Cannot create a child of an Attribute Option that is marked as deleted.
@@ -1316,7 +1316,7 @@
MultiIssueChangeCollision=At least one issue has been modified, please review before submitting your changes."
IssueChangeCollision=Issue has been modified, please review before submitting your changes.
-##
+##
NoPredefinedXModuleListSelected=No predefined cross module list was selected.
ListWithAtLeastOneMITRequired=A list containing at least one module/issue type pair must be selected.
NoSavedXModuleQuerySelected=No saved cross module query was selected.
@@ -1405,7 +1405,7 @@
# Query
NewQueryRequiresApproval=New query requires approval
-# IssueTemplateInfo
+# IssueTemplateInfo
NewTemplateRequiresApproval=New template requires approval
# Issue
@@ -1419,7 +1419,7 @@
## Intake
## ***********************************************************************
-intake_NoAttributeWasSelected=No attribute was selected.
+intake_NoAttributeWasSelected=\u6c92\u6709\u9078\u64c7\u4efb\u4f55\u5c6c\u6027.
intake_BadIdMessage=Invalid ID.
intake_BadIdsMessage=At least one ID is invalid.
intake_AttributeNameNotAllowedEmpty=Attribute name is not allowed to be empty
@@ -1501,7 +1501,7 @@
## *************************************************************************
## Help Index
-ScarabHelp=Scarab Help
+ScarabHelp=Scarab Help
IntroToScarab=Introduction to Scarab
GettingHelp=Getting Help
NavigatingScarab=Navigating Scarab
@@ -1520,14 +1520,14 @@
ScarabProvides=Scarab provides
IntroP2=a robust set of tools for issue management:
IntroP3Head=Issue entry:
-IntroP3=The issue entry process is designed to help users create meaningful issues and avoid duplication. Attributes are used to describe issues and to check the issue database for similar entries. If any duplicates are found, the user has the opportunity to review potential duplicates, add comments to like issues or modify their issue before committing it to the database.
+IntroP3=The issue entry process is designed to help users create meaningful issues and avoid duplication. Attributes are used to describe issues and to check the issue database for similar entries. If any duplicates are found, the user has the opportunity to review potential duplicates, add comments to like issues or modify their issue before committing it to the database.
IntroP4Head=Templates for issue entry:
-IntroP4=Frequently entered issue criteria can be saved in templates for speedy entry. Files can be attached to an issue, and are tracked directly with their issue. Users can add and edit comments to issues as needed. Users can access and review the complete issue history while viewing an issue.
+IntroP4=Frequently entered issue criteria can be saved in templates for speedy entry. Files can be attached to an issue, and are tracked directly with their issue. Users can add and edit comments to issues as needed. Users can access and review the complete issue history while viewing an issue.
IntroP5Head=Issue query:
IntroP5=Accessing issues in the database is simple using the query feature. Users can easily find, access and modify issues individually or in groups. The advanced query feature allows the user to create detailed issue searches, specifying values for multiple attributes and limiting their search to specific date or issue number ranges. The Custom Query feature allows the user to search by text string-the user can specify a set of information to compare against issues in the database. Frequently used queries can be saved and easily run. <!--Once a saved query has been created, the user can request frequent email updates on issues matching the search criteria.-->
-IntroP6Head=Reports:
+IntroP6Head=Reports:
IntroP6=The robust reports interface allows the user to create and save reports. Reports provide customizable and meaningful metrics.
-IntroP7Head=Email notifications:
+IntroP7Head=Email notifications:
IntroP7=As important events occur, email is generated and sent to all parties associated with the event. Alert emails contain links to views of the event.
IntroP8=While Scarab is designed to be an easy to use, intuitive application, should you need additional assistance this help system has been provided. In the help system you will find definitions of Scarab terminology and navigation aid as well as hints for using the application.
@@ -1535,42 +1535,42 @@
EntryForms=Entry forms
ResultsandSelection=Results and selection pages
CustomizingInterface=Customizing the interface
-TheScarab=The Scarab
-NavP1=interface is organized to allow access to all major functionality from anywhere in the application. Each of the action screens provides relevant information along with links to access further details as needed. A unified and consistent interface allows you to easily recognize the types of information and actions available on each screen.
+TheScarab=The Scarab
+NavP1=interface is organized to allow access to all major functionality from anywhere in the application. Each of the action screens provides relevant information along with links to access further details as needed. A unified and consistent interface allows you to easily recognize the types of information and actions available on each screen.
NavP2=Each screen provides the following navigational aids
NavP3Head=The Left navigation bar:
-NavP3=The navigation bar is organized by issue type, then by function. To access functionality within a specific issue type, select the title of the issue type on the left navigation bar. The functionality available to that issue type will appear below the title.
+NavP3=The navigation bar is organized by issue type, then by function. To access functionality within a specific issue type, select the title of the issue type on the left navigation bar. The functionality available to that issue type will appear below the title.
NavP4Head=The Query bar:
NavP4=The query bar provides access to the search tools. The issue ID box allows you to access a specific issue number. The select query box provides access to the Advanced and Custom query features. If you have any saved queries, they will appear in the select query box.
NavP5Head=Section titles:
NavP5=Most information screens are organized in tabular format. Each section is presented with an informative section header, describing the section and, often, providing general information about the section. Column headers with arrows can be used to change the sort order for that table. For the sort column, the title has an arrow indicating the direction of the sort: the default is ascending. To change the direction of the sort click on the arrow.
Buttons=Buttons:
Buttons1=Buttons
-NavP6=Are used to indicate a set of actions that can be performed. Often you will find more than one set of buttons on a page. Buttons directly below a section will perform actions on the section only, if you have you may find an
+NavP6=Are used to indicate a set of actions that can be performed. Often you will find more than one set of buttons on a page. Buttons directly below a section will perform actions on the section only, if you have you may find an
NavP6S2=Update Options
-NavP6S3=button beside an attribute selector in one section. This indicates that if you change the attribute clicking the button will change the options available to that attribute.
+NavP6S3=button beside an attribute selector in one section. This indicates that if you change the attribute clicking the button will change the options available to that attribute.
NavP7Head=Checkboxes:
NavP7=Are used to select list items for modification.
NavP8=In many cases, helpful information is included directly on the screens to clarify unusual operations. Error messages are provided in line to help identify where the error occurred and specific means for remedy.
NavP9Head=Entry forms
NavP9=Entry forms are easy to use. Default data points are indicated with * (asterisks) beside the field title. Often you will find textual guidelines within the entry forms to help you through the form entry process.
-NavP10=Navigational buttons are available on each screen. These buttons perform actions on the data entered in the form. The
+NavP10=Navigational buttons are available on each screen. These buttons perform actions on the data entered in the form. The
CancelDesc=cancels the process in which you currently are engaged.
ContinueDesc=button will take you to the next part of the entry process.
DoneDesc=button will save your work and return you to the last process in which you were engaged.
NextDesc=button indicates that there is further information to be gathered on the next screen. Clicking this button will cache your current data and take you to the next part in the wizard.
-NavP10Head=Tabs
+NavP10Head=Tabs
NavP10S1=Some multipart functionality provides tabs for easy navigation between parts. In the reports functionality you can use the tabs to switch from defining row content to the final output characteristics.
-NavP11=If you have a saved data set for an entry form (like saved queries or reports, or issue entry templates), the top section contains a drop down list with all such items available for use on this form. This appears in the issue entry, query and reports functionality. To use a saved form select the one of interest from the drop down box and use the
+NavP11=If you have a saved data set for an entry form (like saved queries or reports, or issue entry templates), the top section contains a drop down list with all such items available for use on this form. This appears in the issue entry, query and reports functionality. To use a saved form select the one of interest from the drop down box and use the
Selectlc=select
NavP11S2=button to render the selection.
-NavP12=Each attribute in an entry form displays all available options, from which you can select one or more.
+NavP12=Each attribute in an entry form displays all available options, from which you can select one or more.
NavP13Head=Results and selection pages
NavP13=Results screens appear after you have activated a request, like a query, a report, etc. Each results screen provides a list of items with some descriptive information.
NavP14=Many results screens allow you to perform actions on the items that appear. Under the items you will find a set of dropdown boxes containing actions that can be performed. The first box allows to export the results in the selected format. The available formats are Excel (.xls) and tab separated values. Once you select the export format from the dropdown box, the results will appear in the browser window in the format selected. You can then save the results locally.
-NavP15=The second box allows you to perform specific actions on all or a selected subset of the results. The available actions are View, Assign, Copy, and Move.
-NavP16Head=Sort order
-NavP16=Items are initially in ascending order by their ID. To sort by an attribute, click the title of the attribute. The sort will change to ascending by that attribute. Clicking the arrow beside the attribute name will provide a descending sort.
+NavP15=The second box allows you to perform specific actions on all or a selected subset of the results. The available actions are View, Assign, Copy, and Move.
+NavP16Head=Sort order
+NavP16=Items are initially in ascending order by their ID. To sort by an attribute, click the title of the attribute. The sort will change to ascending by that attribute. Clicking the arrow beside the attribute name will provide a descending sort.
NavP17=Many screens are customizable. You can add to or remove the attributes that appear on your screen by clicking on the add/remove attributes from view link. Use the check boxes to show or hide attributes. Add a check to the items you would like to appear on your screen. Use this screen to determine the order of the columns by using the "Columnar sequence" field.
## ScarabBestPractices
@@ -1578,62 +1578,62 @@
ProjectKnowledge=Project knowledge sharing
TrackingProject=Tracking project health
BestP1=The success of any project depends on managing and solving problems. How you use the tools will be dependent upon how your project is organized and your planned workflow processes. You can use the tools as a knowledge sharing device and a means of tracking and managing the health of your project.
-BestP2=Information captured within Scarab can be highly effective for many areas within a project. Because Scarab is so highly configurable, knowledge resources can be customized to the needs of each discipline within an organization. Tracking a feature across discipline lines can be done by copying issues and creating dependencies between them. For instance, Project Go has issue types organized by milestone within the feature lifecycle. Project Go has the following issue types: Planning, Development, Testing, Release management and Support. New features are entered in the Planning issue type where they are processed till ready for development. At that point, the issue is copied to Development, Release management and Testing issue types and all copies are set to blocked by the Development issue. All actors have a full description of the feature, including all conversations involved in c
reating the specifications. Since all issues have interdependencies, monitoring efforts across the discipline lines is an easy process. Blocking all the issues by the Development issue means that none of them can be closed till the development cycle has completed, but each group can continue to work based on what is happening with the development project. For example, documentation may be a part of the release management cycle. Writers can track the features in development and track their documentation efforts in their own issue with links to the development issue. After the feature has been released to the users, support can track incoming issues and easily access information about the feature through any of the issue types and be able to link to other areas quickly through the issue history.
+BestP2=Information captured within Scarab can be highly effective for many areas within a project. Because Scarab is so highly configurable, knowledge resources can be customized to the needs of each discipline within an organization. Tracking a feature across discipline lines can be done by copying issues and creating dependencies between them. For instance, Project Go has issue types organized by milestone within the feature lifecycle. Project Go has the following issue types: Planning, Development, Testing, Release management and Support. New features are entered in the Planning issue type where they are processed till ready for development. At that point, the issue is copied to Development, Release management and Testing issue types and all copies are set to blocked by the Development issue. All actors have a full description of the feature, including all conversations involved in c
reating the specifications. Since all issues have interdependencies, monitoring efforts across the discipline lines is an easy process. Blocking all the issues by the Development issue means that none of them can be closed till the development cycle has completed, but each group can continue to work based on what is happening with the development project. For example, documentation may be a part of the release management cycle. Writers can track the features in development and track their documentation efforts in their own issue with links to the development issue. After the feature has been released to the users, support can track incoming issues and easily access information about the feature through any of the issue types and be able to link to other areas quickly through the issue history.
BestP3=Scarab can assist in tracking and assessing the health of a project. If your project is experiencing a particular type of concern you need to track, Scarab can help you do this through a series of processes. For example, Project Go has just added a new database and developers are concerned that the new database will cause significant performance problems. While running routine reports and queries, the project lead has determined that there is, indeed, a performance issue possibly associated with the new database. It is determined that fixing this problem is top priority and critical to the success of the project. To facilitate work on this problem, the project owner has created an issue entry template and series of queries and reports. Users are asked to use the template and enter specific information about what they have found in a description attribute. The template is used to
regularize information about issues. Using a saved query, project members can quickly access issues involving this concern and concentrate efforts in critical areas. Tracking the progress of resolving the performance problems can be done using reports. How to configure it for your needs can be confusing. This document is a suggested set of practices.
## ScarabFAQ
FrequentlyAskedQuestions=Frequently asked questions
WhatIssueType=How do I figure out what issue type to use?
-WhatIssueTypeAnswer=The issue types available to you in your project have been determined by your project administrator. By accessing the
+WhatIssueTypeAnswer=The issue types available to you in your project have been determined by your project administrator. By accessing the
WhatIssueTypeAnswer2=Issue Type
-WhatIssueTypeAnswer3=screen you can see a description of each issue type and select the one that best describes your issue. For more information see the
+WhatIssueTypeAnswer3=screen you can see a description of each issue type and select the one that best describes your issue. For more information see the
WhatIssueTypeAnswer4=discussion.
-CanIMoveIssues=Can I move an issue to a different issue type? How about to a different project?
+CanIMoveIssues=Can I move an issue to a different issue type? How about to a different project?
CanIMoveIssuesAnswer=Issues can be moved between issue types through the issue detail page. For more information see the
CanIMoveIssuesAnswer2=moving issues
-CanIMoveIssuesAnswer3=discussion. For a discussion on circumstances in which you may wish to move issues, see the
+CanIMoveIssuesAnswer3=discussion. For a discussion on circumstances in which you may wish to move issues, see the
CanIMoveIssuesAnswer4=document.
StopDuplicateChecking=How can I stop the duplication checking?
StopDuplicateCheckingAnswer=The duplication checking process is set by the project leader. If you feel it is affecting the processing of issues, contact your project administrator.
CanIAddAttributes=How do I add or remove attributes from my screen?
-CanIAddAttributesAnswer=Many pages in Scarab are customizable. For more information see the discussion on
+CanIAddAttributesAnswer=Many pages in Scarab are customizable. For more information see the discussion on
CustomizingTheScreen=customizing the screen.
GlobalAndUserAttributes=What is the difference between a Global attribute and a User attribute?
GlobalAndUserAttributesAnswer=Global attributes are used to define issues. Global attributes are defined at the domain level and made available within issue types by the Project Owner. When creating issues, the values assigned to global attributes become the descriptors for issues. Values associated with global attributes are used to search the database for issues when using queries. You may find Global attributes like "Status", "Description", "Operating System" and the like in your Issue Type.
GlobalAndUserAttributesAnswer2=Once issues are created, User attributes are used to associate users with issues. User attributes are defined at the global level and are associated with a base permission and an email action. Users with the right permission appear in the User attributes drop down menu and can be associated with an issue using that User attribute. The Assigned To attribute is a User attribute.
-GlobalAndUserAttributesAnswer3=For more information on Global attributes see
-GlobalAndUserAttributesAnswer4=For more information on User attributes see
+GlobalAndUserAttributesAnswer3=For more information on Global attributes see
+GlobalAndUserAttributesAnswer4=For more information on User attributes see
ModifyingIssues=Modifying issues
## ScarabGlossary
GlossaryDesc=The following is a short list of terms found in the Scarab interface.
ActiveInactive=Active/inactive
-ActiveInactiveDef=parameter that determines if an item is available for use
-AssignDef=associating a user with an issue through the "assign" user attribute
+ActiveInactiveDef=parameter that determines if an item is available for use
+AssignDef=associating a user with an issue through the "assign" user attribute
Attachment=Attachment
-AttachmentDef=files can be attached directly to issues
-AttributeDef=Attributes are associated with issue types within projects and are used to define issues.
+AttachmentDef=files can be attached directly to issues
+AttributeDef=Attributes are associated with issue types within projects and are used to define issues.
AttributeGroup=Attribute group
-AttributeGroupDef=Attributes associated with an issue are organized within attribute groups.
+AttributeGroupDef=Attributes associated with an issue are organized within attribute groups.
CompAnalysisReport=Comparative analysis report
-CompAnalysisReportDef=a report that provides a snap shot of a single point in time
+CompAnalysisReportDef=a report that provides a snap shot of a single point in time
Defect=Defect
-DefectDef=issues identified within existing feature/functionality
+DefectDef=issues identified within existing feature/functionality
Feature=Feature
-FeatureDef=new functionality to be incorporated into the project
-GlobalAttributeDef=a set of predefined attributes available for association with all projects
-IssueTypeDef=All scarab processes are performed within the realm of an issue type. Issue types are comprised of a unique set of attributes, attribute options, issues, templates, queries and reports.
+FeatureDef=new functionality to be incorporated into the project
+GlobalAttributeDef=a set of predefined attributes available for association with all projects
+IssueTypeDef=All scarab processes are performed within the realm of an issue type. Issue types are comprised of a unique set of attributes, attribute options, issues, templates, queries and reports.
RateOfChangeReport=Rate of change report
-RateOfChangeReportDef=a report that tracks changes to issues over a period of time
+RateOfChangeReportDef=a report that tracks changes to issues over a period of time
Report=Report
-ReportDef=to track the progress of your project
+ReportDef=to track the progress of your project
PrimaryFilterAttribute=Primary filter attribute
-PrimaryFilterAttributeDef=defines the subset of issues from which the report is drawn
-QueryDef=allows you to search for issues within the database
+PrimaryFilterAttributeDef=defines the subset of issues from which the report is drawn
+QueryDef=allows you to search for issues within the database
Template=Template
-TemplateDef=a set of values for quick access and use while creating issues
-UserAttributesDef=User attributes are used to associate users with issues
+TemplateDef=a set of values for quick access and use while creating issues
+UserAttributesDef=User attributes are used to associate users with issues
## UserIssueEntry
Overview=Overview
@@ -1651,10 +1651,10 @@
IssueEntryP2Head=Reproducible.
IssueEntryP2=Issues that cannot be duplicated are generally marked invalid. Provide detailed instructions for duplicating your issue.
IssueEntryP3Head=Specific
-IssueEntryP3=The more details you provide the easier it is for the engineer to identify the problem and solution.
+IssueEntryP3=The more details you provide the easier it is for the engineer to identify the problem and solution.
IssueEntryP4=For example: you're testing a web browser. You crash at example.com, and want to write up an issue report:
IssueEntryP5=Inappropriate:
-IssueEntryP6="My browser crashed. I think I was on example.com. My computer uses Windows. I think that this is a really bad problem and you should fix it now. By the way, I don't like the icons. Nobody will use your software if you keep those ugly icons. Oh, and my grandmother's home page does not look right, either, it's all messed up. Good luck."
+IssueEntryP6="My browser crashed. I think I was on example.com. My computer uses Windows. I think that this is a really bad problem and you should fix it now. By the way, I don't like the icons. Nobody will use your software if you keep those ugly icons. Oh, and my grandmother's home page does not look right, either, it's all messed up. Good luck."
IssueEntryP7=More appropriate:
IssueEntryP8="I crashed each time when I went to example.com, using the 10.28.99 build on a Win NT 4.0 (Service Pack 5) system. I also rebooted into Linux, and reproduced this problem using the 10.28.99 Linux build.
IssueEntryP9=It again crashed each time upon drawing the banner at the top of the page. I broke apart the page, and discovered that the following image link will crash the application reproducibly, unless you remove the "border=0" attribute:
@@ -1666,7 +1666,7 @@
IssueEntryP13=While creating the issue, use the textual fields to add as much specific information for the issue. Your administrator may have defined attributes to track specific generic information, but the more details you can add into the text fields the better issue you will have created.
IssueEntryP14Head=Adding supporting information
IssueEntryP14=In the issue entry process you can add additional relevant information; you can include dependencies on other issues as well as attaching appropriate files (like patches, emails, etc.).
-IssueEntryP15Head=Setting dependencies:
+IssueEntryP15Head=Setting dependencies:
IssueEntryP15=Issues often have dependencies on other issues. One issue may require a resolution from another before any work can be done. Two issues may have parallel resolutions and need to be tracked together, though they have no direct influence on one another.
IssueEntryP16=There are three levels of dependencies within Scarab: blocking, duplicating and non-blocking. Blocking issues prevent the issue being blocked, from being resolved. The blocking issue must be addressed before the blocked issue can be resolved.
IssueEntryP17=Sometimes duplicate issues may be entered and need to be tracked separately. Marking an issue as a duplicate allows users to track efforts on both issues. Duplicates may be in different modules or the same module.
@@ -1674,22 +1674,22 @@
IssueEntryP19=You can track the progress of interrelated issues by using the Dependencies section of the issue and clicking on either the issue ID or the Issue summary links to the issues. In this area you can also redefine the Dependency type.
IssueEntryP20Head=Issue attachments:
IssueEntryP20S1=Keeping track of information relating to an issue is simplified using the issue attachment feature. You can include email conversations, relevant documentation, patch files, or any other supporting file. If you need to include a url, you can add that into any text field. To add a file, use the
-IssueEntryP20S2=section in the
-IssueEntryP20S3=form (if you have duplication active, this will appear after the duplication checking process). To do so, enter a brief description of the attachment and use the browse button to navigate to the file on your local system or enter a path for the file and click the
+IssueEntryP20S2=section in the
+IssueEntryP20S3=form (if you have duplication active, this will appear after the duplication checking process). To do so, enter a brief description of the attachment and use the browse button to navigate to the file on your local system or enter a path for the file and click the
IssueEntryP20S4=button. You can repeat this process to add multiple files.
IssueEntryP21Head=Handling Duplicates
IssueEntryP22=If you have duplication checking active, Scarab will use a subset of attributes to check for possible duplicates in the database. If duplicates are found a report of similar issues will be presented with your issue listed at the top. Review the issues listed to determine if an existing issue covers the issue you are entering. You can do a number of things at this point:
-IssueEntryP23=Review individual issues by clicking on their ID. The full issue descriptionIssueEntry will appear.
+IssueEntryP23=Review individual issues by clicking on their ID. The full issue descriptionIssueEntry will appear.
IssueEntryP24=Sort issues by some of the categories. Click on the name of the category to change the sort order
IssueEntryP25=Alter one or more issues at the same time. Click on the check box to the left of the issue IDs that you would like to manipulate. You can then enter a note in the
-IssueEntryP25S2=field and click the
+IssueEntryP25S2=field and click the
IssueEntryP25S3=button to add a note to the comments section of all issues selected.
-IssueEntryP26=Skip this process by clicking on the
+IssueEntryP26=Skip this process by clicking on the
IssueEntryP26S2=button.
IssueEntryP27Head=Reviewing duplicates
-IssueEntryP27=For each item in the database that has been identified as a possible duplicate for the criteria you entered, an entry appears in the
+IssueEntryP27=For each item in the database that has been identified as a possible duplicate for the criteria you entered, an entry appears in the
IssueEntryP27S2=Identified as duplicate
-IssueEntryP27S3=screen. You can change the sort order by clicking on the title of the column. Each column represents an attribute used in the search for duplicates.
+IssueEntryP27S3=screen. You can change the sort order by clicking on the title of the column. Each column represents an attribute used in the search for duplicates.
IssueEntryP28=Each module has a set of assigned attributes. The values entered for each of the attributes is parsed into a search string so that each value becomes a searchable string. Use this page to compare your potential new issue with those in the database.
IssueEntryP29Head=Commenting on like issues
IssueEntryP29=The note box under the list of like issues allows you to add comments to issues without going to the issue. You may want to comment that you are experiencing similar problems, recommend a solution for a similar issue or add to the information in an attribute. Information entered in the
@@ -2013,7 +2013,7 @@
UITP6=Enter values into the Template details section. The name of your template should be short and descriptive. For instance, to create a template to enter defects affecting performance, you could name it "Performance" and use the description field to detail the types of performance issues this template covers.
UITP7=Select the level of availability for the template. Selecting personal will render the template available to the creator only. To make the template available globally you must have the permission to do so and/or go through an approval process (see Approvals).
UITP8=Enter appropriate values in the Template Attributes section. Attributes appearing in this section are the same as appear in the
-screen=screen
+screen=\u756b\u9762
UITP9=button to save your template.
UITP10S1=To use the template, on the
UITP10S2=screen click on the name of the template and click the
@@ -2022,7 +2022,7 @@
UITP10S5=button to return to the Enter new screen.
FromThe=From the
ScreenClickThe=screen click the
-CannotEditTemplate=You do not have permissions to edit this template.
+CannotEditTemplate=\u60a8\u6c92\u6709\u6b0a\u9650\u7de8\u8f2f\u9019\u500b\u6a23\u677f.
IssueTypeNotAvailable=The issue type for which you were entering data is no longer available.## ***********************************************************************
## SCARAB Exceptions
## ***********************************************************************
@@ -2072,7 +2072,7 @@
ExceptionMaxdateBeforeMindate = maxDate "{0}" is before minDate "{1}"
ExceptionSearchIsNotAllowed = Search is not allowed.
ExceptionDeleteOptionFromLockedIssueType = You cannot delete this option, because this issue type is locked.
-ExceptionOptionNotFound = Can''t find ROptionOption with ID {0}:{1}
+ExceptionOptionNotFound = Can't find ROptionOption with ID {0}:{1}
ExceptionDuplicateUsername = duplicate usernames for user "{0}"
ExceptionQueryTooComplex = Query is too complex
ExceptionFailedToReadIdentifierList = Failed to retrieve a list of attribute identifiers. The detailed message: {0}
@@ -2085,7 +2085,7 @@
ExceptionClassNotFound = Class not found {0}. The detailed message: "{1}"
ExceptionLookupGlobalCache = Problem looking up GlobalCacheService service: Detail message: "{0}"
ExceptionScarabCacheService = init: Failed to get a Pool object. Detail message: "{0}"
-ExceptionComponentLocator = internal configuration Problem: can''t look up service for class "{0}". Detail message: "{1}"
+ExceptionComponentLocator = internal configuration Problem: can't look up service for class "{0}". Detail message: "{1}"
ExceptionDatabaseGenericError = Database access generic problem. Notify the administrator.
AttributesContainsNull = List of attributes contained a null
@@ -2137,6 +2137,6 @@
# Localization for Javascript Date calendar
DateFirstWeekDay = 0
-DateWeekDays = "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
-DateToday=Today
+DateWeekDays = "\u661f\u671f\u65e5", "\u661f\u671f\u4e00", "\u661f\u671f\u4e8c", "\u661f\u671f\u4e09", "\u661f\u671f\u56db", "\u661f\u671f\u4e94", "\u661f\u671f\u516d"
+DateToday=\u4eca\u5929
DateClean=Clean
Modified: trunk/src/conf/conf/TurbineResources.properties
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/conf/conf/TurbineResources.properties?view=diff&rev=10257&p1=trunk/src/conf/conf/TurbineResources.properties&p2=trunk/src/conf/conf/TurbineResources.properties&r1=10256&r2=10257
==============================================================================
--- trunk/src/conf/conf/TurbineResources.properties (original)
+++ trunk/src/conf/conf/TurbineResources.properties 2006-08-07 15:43:30-0700
@@ -761,7 +761,7 @@
services.ScarabSecurity.action.ReportIssue=Issue__Enter
services.ScarabSecurity.action.ConfigureIssueList=User__Edit_Preferences
services.ScarabSecurity.action.Search=Issue__Search
-services.ScarabSecurity.action.ModifyIssue=Issue__Enter
+services.ScarabSecurity.action.ModifyIssue=Issue__Edit
services.ScarabSecurity.action.ViewIssue=Issue__View
services.ScarabSecurity.action.ModifyModule=Module__Edit
services.ScarabSecurity.action.DefineXModuleList=Issue__Search
Modified: trunk/src/conf/conf/scarab-pipeline.xml
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/conf/conf/scarab-pipeline.xml?view=diff&rev=10257&p1=trunk/src/conf/conf/scarab-pipeline.xml&p2=trunk/src/conf/conf/scarab-pipeline.xml&r1=10256&r2=10257
==============================================================================
--- trunk/src/conf/conf/scarab-pipeline.xml (original)
+++ trunk/src/conf/conf/scarab-pipeline.xml 2006-08-07 15:43:30-0700
@@ -12,6 +12,7 @@
<org.apache.turbine.pipeline.DetermineActionValve/>
<org.tigris.scarab.pipeline.DetermineTargetValve/>
<org.apache.turbine.pipeline.DefaultSessionTimeoutValve/>
+ <org.tigris.scarab.pipeline.NTLMLoginValve/>
<org.tigris.scarab.pipeline.AnonymousLoginValve/>
<org.apache.turbine.pipeline.DefaultLoginValve/>
<org.apache.turbine.pipeline.DefaultSessionValidationValve/>
Modified: trunk/src/java/org/apache/fulcrum/localization/Localization.java
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/java/org/apache/fulcrum/localization/Localization.java?view=diff&rev=10257&p1=trunk/src/java/org/apache/fulcrum/localization/Localization.java&p2=trunk/src/java/org/apache/fulcrum/localization/Localization.java&r1=10256&r2=10257
==============================================================================
--- trunk/src/java/org/apache/fulcrum/localization/Localization.java (original)
+++ trunk/src/java/org/apache/fulcrum/localization/Localization.java 2006-08-07 15:43:30-0700
@@ -58,9 +58,7 @@
import java.util.ResourceBundle;
import javax.servlet.http.HttpServletRequest;
-
-import org.apache.fulcrum.TurbineServices;
-import org.apache.turbine.services.yaaficomponent.YaafiComponentService;
+import org.tigris.scarab.services.ServiceManager;
/**
* <p>Wrapper around the TurbineLocalization Service that makes it easy
@@ -284,15 +282,8 @@
{
if (localizationService==null)
{
- try{
- YaafiComponentService yaafi = (YaafiComponentService) TurbineServices.getInstance().getService(
- YaafiComponentService.SERVICE_NAME);
- localizationService = (LocalizationService) yaafi.lookup(LocalizationService.class.getName());
- }
- catch (Exception e)
- {
- throw new RuntimeException("Problem looking up localization service: " + e.getMessage());
- }
+ ServiceManager sm = ServiceManager.getInstance();
+ localizationService = (LocalizationService) sm.lookup(LocalizationService.class);
}
return localizationService;
}
Modified: trunk/src/java/org/tigris/scarab/actions/AssignIssue.java
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/java/org/tigris/scarab/actions/AssignIssue.java?view=diff&rev=10257&p1=trunk/src/java/org/tigris/scarab/actions/AssignIssue.java&p2=trunk/src/java/org/tigris/scarab/actions/AssignIssue.java&r1=10256&r2=10257
==============================================================================
--- trunk/src/java/org/tigris/scarab/actions/AssignIssue.java (original)
+++ trunk/src/java/org/tigris/scarab/actions/AssignIssue.java 2006-08-07 15:43:30-0700
@@ -503,7 +503,7 @@
NotificationManagerFactory.getInstance()
.addActivityNotification(
ActivityType.USER_ATTRIBUTE_CHANGED,
- activitySet, issue);
+ activitySet, issue, user);
}
catch(Exception e)
{
Modified: trunk/src/java/org/tigris/scarab/actions/Login.java
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/java/org/tigris/scarab/actions/Login.java?view=diff&rev=10257&p1=trunk/src/java/org/tigris/scarab/actions/Login.java&p2=trunk/src/java/org/tigris/scarab/actions/Login.java&r1=10256&r2=10257
==============================================================================
--- trunk/src/java/org/tigris/scarab/actions/Login.java (original)
+++ trunk/src/java/org/tigris/scarab/actions/Login.java 2006-08-07 15:43:30-0700
@@ -62,7 +62,6 @@
// Scarab Stuff
import org.tigris.scarab.tools.ScarabRequestTool;
-import org.tigris.scarab.tools.ScarabLocalizationTool;
import org.tigris.scarab.tools.localization.L10NKeySet;
import org.tigris.scarab.tools.localization.L10NMessage;
import org.tigris.scarab.tools.localization.Localizable;
@@ -72,6 +71,7 @@
import org.tigris.scarab.om.ScarabUser;
import org.tigris.scarab.om.Module;
import org.tigris.scarab.actions.base.ScarabTemplateAction;
+import org.tigris.scarab.services.security.ScarabSecurity;
/**
* This class is responsible for dealing with the Login
@@ -96,42 +96,49 @@
List userModules = user.getModules();
if (userModules != null)
{
- Module module = null;
+ Module uniqueModule = null;
if (userModules.size() == 2)
{
Module module1 = (Module)userModules.get(0);
Module module2 = (Module)userModules.get(1);
if (module1.isGlobalModule())
{
- module = module2;
+ uniqueModule = module2;
}
else if (module2.isGlobalModule())
{
- module = module1;
+ uniqueModule = module1;
}
}
- if (module != null || userModules.size() == 1)
+ else if (userModules.size() == 1)
{
- ScarabRequestTool scarabR = getScarabRequestTool(context);
- if (module == null)
+ uniqueModule = (Module)userModules.get(0);
+ if (uniqueModule.isGlobalModule())
{
- module = (Module)userModules.get(0);
+ uniqueModule = null;
}
- scarabR.setCurrentModule(module);
+ }
+
+ if (uniqueModule != null )
+ {
+ getScarabRequestTool(context).setCurrentModule(uniqueModule);
data.getParameters().remove(ScarabConstants.CURRENT_MODULE);
data.getParameters().add(ScarabConstants.CURRENT_MODULE,
- module.getQueryKey());
+ uniqueModule.getQueryKey());
+
if ("SelectModule.vm".equals(data.getParameters()
- .getString(ScarabConstants.NEXT_TEMPLATE)))
+ .getString(ScarabConstants.NEXT_TEMPLATE, "SelectModule.vm"))
+ && user.hasPermission(ScarabSecurity.ISSUE__ENTER, uniqueModule ))
{
data.getParameters().remove(ScarabConstants.NEXT_TEMPLATE);
+ data.getParameters().add(ScarabConstants.NEXT_TEMPLATE,
+ "home,EnterNew.vm");
}
}
}
-
String template = data.getParameters()
.getString(ScarabConstants.NEXT_TEMPLATE,
- "home,EnterNew.vm");
+ "SelectModule.vm");
setTarget(data, template);
}
}
@@ -144,7 +151,6 @@
{
IntakeTool intake = getIntakeTool(context);
ScarabRequestTool scarabR = getScarabRequestTool(context);
- ScarabLocalizationTool l10n = getLocalizationTool(context);
Group login = intake.get("Login", IntakeTool.DEFAULT_KEY);
String username = login.get("Username").toString();
@@ -265,4 +271,5 @@
{
doLogin(data, context);
}
+
}
Modified: trunk/src/java/org/tigris/scarab/actions/ModifyIssue.java
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/java/org/tigris/scarab/actions/ModifyIssue.java?view=diff&rev=10257&p1=trunk/src/java/org/tigris/scarab/actions/ModifyIssue.java&p2=trunk/src/java/org/tigris/scarab/actions/ModifyIssue.java&r1=10256&r2=10257
==============================================================================
--- trunk/src/java/org/tigris/scarab/actions/ModifyIssue.java (original)
+++ trunk/src/java/org/tigris/scarab/actions/ModifyIssue.java 2006-08-07 15:43:30-0700
@@ -403,14 +403,18 @@
final ActivitySet activitySet = issue.setAttributeValues(null,
newAttVals, attachment, user);
// save reason as a comment as well?
- if( saveAsComment ){
+ if( saveAsComment )
+ {
issue.addComment(activitySet, attachment, user);
}
+ else
+ {
+ NotificationManagerFactory.getInstance().addActivityNotification(
+ ActivityType.ATTRIBUTE_CHANGED,
+ activitySet, issue, user);
+ }
intake.removeAll();
scarabR.setConfirmMessage(L10NKeySet.ChangesSaved);
- NotificationManagerFactory.getInstance().addActivityNotification(
- ActivityType.ATTRIBUTE_CHANGED,
- activitySet, issue);
}
catch (Exception se)
{
@@ -500,20 +504,27 @@
String dataFieldString = dataField.toString();
if (dataFieldString != null && dataFieldString.trim().length() > 0)
{
- // create the new attachment
- Attachment attachment = AttachmentManager.getInstance();
- // set the form data to the attachment object
- newGroup.setProperties(attachment);
- activitySet = issue.addUrl(attachment, user);
-
- // remove the group
- intake.remove(newGroup);
- scarabR.setConfirmMessage(L10NKeySet.UrlSaved);
- NotificationManagerFactory.getInstance()
- .addActivityNotification(
- ActivityType.URL_ADDED, activitySet,
- issue);
-
+ if (intake.isAllValid())
+ {
+ // create the new attachment
+ Attachment attachment = AttachmentManager.getInstance();
+ // set the form data to the attachment object
+ newGroup.setProperties(attachment);
+ activitySet = issue.addUrl(attachment, user);
+
+ // remove the group
+ intake.remove(newGroup);
+ scarabR.setConfirmMessage(L10NKeySet.UrlSaved);
+ NotificationManagerFactory.getInstance()
+ .addActivityNotification(
+ ActivityType.URL_ADDED, activitySet,
+ issue,
+ user);
+ }
+ else
+ {
+ scarabR.setAlertMessage(ERROR_MESSAGE);
+ }
}
}
}
@@ -648,7 +659,7 @@
NotificationManagerFactory.getInstance()
.addActivityNotification(
ActivityType.ATTACHMENT_CREATED,
- activitySet, issue);
+ activitySet, issue, user);
}
else
@@ -860,7 +871,7 @@
{
scarabR.setConfirmMessage(DEFAULT_MSG);
NotificationManagerFactory.getInstance().addActivityNotification(
- ActivityType.URL_DELETED, activitySet, issue);
+ ActivityType.URL_DELETED, activitySet, issue, user);
}
else
{
@@ -937,7 +948,7 @@
}
NotificationManagerFactory.getInstance().addActivityNotification(
ActivityType.ATTACHMENT_REMOVED, activitySet,
- issue);
+ issue, user);
}
else
{
@@ -1271,11 +1282,11 @@
NotificationManagerFactory.getInstance()
.addActivityNotification(
ActivityType.DEPENDENCY_CREATED,
- activitySet, childIssue);
+ activitySet, childIssue, user);
NotificationManagerFactory.getInstance()
.addActivityNotification(
ActivityType.DEPENDENCY_CREATED,
- activitySet, issue);
+ activitySet, issue, user);
}
return true;
}
@@ -1362,7 +1373,7 @@
scarabR.setConfirmMessage(DEFAULT_MSG);
NotificationManagerFactory.getInstance().addActivityNotification(
ActivityType.DEPENDENCY_CHANGED,
- activitySet, issue);
+ activitySet, issue, user);
return true;
}
else // nothing changed
@@ -1439,7 +1450,7 @@
scarabR.setConfirmMessage(DEFAULT_MSG);
NotificationManagerFactory.getInstance().addActivityNotification(
ActivityType.DEPENDENCY_CHANGED,
- activitySet, issue);
+ activitySet, issue, user);
return true;
}
Modified: trunk/src/java/org/tigris/scarab/actions/ModifyModule.java
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/java/org/tigris/scarab/actions/ModifyModule.java?view=diff&rev=10257&p1=trunk/src/java/org/tigris/scarab/actions/ModifyModule.java&p2=trunk/src/java/org/tigris/scarab/actions/ModifyModule.java&r1=10256&r2=10257
==============================================================================
--- trunk/src/java/org/tigris/scarab/actions/ModifyModule.java (original)
+++ trunk/src/java/org/tigris/scarab/actions/ModifyModule.java 2006-08-07 15:43:30-0700
@@ -217,18 +217,25 @@
}
}
- ParameterParser pp = data.getParameters();
- String name = GlobalParameter.ISSUE_REASON_REQUIRED;
- String allowEmptyReason = pp.getString(name);
- if (allowEmptyReason == null)
- allowEmptyReason = "";
- GlobalParameterManager.setString(name, me,allowEmptyReason);
-
- // Is there a needed role for even requesting access?
- name = GlobalParameter.REQUIRED_ROLE_FOR_REQUESTING_ACCESS;
+ ParameterParser pp = data.getParameters();
+ storeGlobalParameter(GlobalParameter.ISSUE_REASON_REQUIRED, me, pp);
+ storeGlobalParameter(GlobalParameter.REQUIRED_ROLE_FOR_REQUESTING_ACCESS, me, pp);
+ storeGlobalParameter(GlobalParameter.COMMENT_RENDER_ENGINE, me, pp);
+
+ }
+
+ /**
+ * @param me
+ * @param pp
+ * @throws TorqueException
+ */
+ private void storeGlobalParameter(String name, Module me, ParameterParser pp) throws TorqueException
+ {
String requiredRole = pp.getString(name);
if (null == requiredRole)
+ {
requiredRole = "";
+ }
GlobalParameterManager.setString(name, me, requiredRole);
}
Modified: trunk/src/java/org/tigris/scarab/actions/MoveIssue.java
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/java/org/tigris/scarab/actions/MoveIssue.java?view=diff&rev=10257&p1=trunk/src/java/org/tigris/scarab/actions/MoveIssue.java&p2=trunk/src/java/org/tigris/scarab/actions/MoveIssue.java&r1=10256&r2=10257
==============================================================================
--- trunk/src/java/org/tigris/scarab/actions/MoveIssue.java (original)
+++ trunk/src/java/org/tigris/scarab/actions/MoveIssue.java 2006-08-07 15:43:30-0700
@@ -336,7 +336,7 @@
// Send notification for the target issue/module
NotificationManagerFactory.getInstance().addActivityNotification(
activityType,
- newIssue.getLastActivitySet(), issue, null, null);
+ newIssue.getLastActivitySet(), issue, null, null, user);
// If it's moved, should also notify users associated in the old
// location because the issue is dissapearing from there.
@@ -347,7 +347,7 @@
.addActivityNotification(
activityType,
issue.getLastActivitySet(), issue, null,
- null);
+ null, user);
}
}
Modified: trunk/src/java/org/tigris/scarab/actions/ReportIssue.java
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/java/org/tigris/scarab/actions/ReportIssue.java?view=diff&rev=10257&p1=trunk/src/java/org/tigris/scarab/actions/ReportIssue.java&p2=trunk/src/java/org/tigris/scarab/actions/ReportIssue.java&r1=10256&r2=10257
==============================================================================
--- trunk/src/java/org/tigris/scarab/actions/ReportIssue.java (original)
+++ trunk/src/java/org/tigris/scarab/actions/ReportIssue.java 2006-08-07 15:43:30-0700
@@ -577,7 +577,7 @@
NotificationManagerFactory.getInstance()
.addActivityNotification(
ActivityType.ISSUE_CREATED,
- activitySet, issue);
+ activitySet, issue, user);
cleanup(data, context);
data.getParameters().add("id", issue.getUniqueId().toString());
@@ -699,13 +699,13 @@
if (attachment.getData() != null
&& attachment.getData().trim().length() > 0)
{
+ ScarabUser user = (ScarabUser)data.getUser();
activitySet =
- prevIssue.addComment(activitySet, attachment,
- (ScarabUser)data.getUser());
+ prevIssue.addComment(activitySet, attachment, user);
NotificationManagerFactory.getInstance()
.addActivityNotification(
ActivityType.COMMENT_ADDED,
- activitySet, issue, null, null);
+ activitySet, issue, null, null, user);
scarabR.setConfirmMessage(L10NKeySet.CommentAdded);
}
else
Modified: trunk/src/java/org/tigris/scarab/actions/admin/AttributeGroupEdit.java
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/java/org/tigris/scarab/actions/admin/AttributeGroupEdit.java?view=diff&rev=10257&p1=trunk/src/java/org/tigris/scarab/actions/admin/AttributeGroupEdit.java&p2=trunk/src/java/org/tigris/scarab/actions/admin/AttributeGroupEdit.java&r1=10256&r2=10257
==============================================================================
--- trunk/src/java/org/tigris/scarab/actions/admin/AttributeGroupEdit.java (original)
+++ trunk/src/java/org/tigris/scarab/actions/admin/AttributeGroupEdit.java 2006-08-07 15:43:30-0700
@@ -153,20 +153,20 @@
}
String groupId = data.getParameters().getString("groupId");
- AttributeGroup ag = AttributeGroupManager
+ AttributeGroup attributeGroup = AttributeGroupManager
.getInstance(new NumberKey(groupId), false);
LocalizationKey l10nKey = DEFAULT_MSG;
// Check if issue type is locked
- if (!ag.isGlobal() && issueType.getLocked())
+ if (!attributeGroup.isGlobal() && issueType.getLocked())
{
scarabR.setAlertMessage(L10NKeySet.LockedIssueType);
return false;
}
// Check for duplicate sequence numbers
- if (areThereDupeSequences(ag.getRAttributeAttributeGroups(), intake,
+ if (areThereDupeSequences(attributeGroup.getRAttributeAttributeGroups(), intake,
"RAttributeAttributeGroup", "Order", 0))
{
scarabR.setAlertMessage(
@@ -175,7 +175,7 @@
return false;
}
- List rmas = ag.getRModuleAttributes();
+ List rmas = attributeGroup.getRModuleAttributes();
ArrayList lockedAttrs = new ArrayList();
if (intake.isAllValid())
@@ -273,7 +273,7 @@
rma.save();
// Set properties for attribute-attribute group mapping
RAttributeAttributeGroup raag =
- ag.getRAttributeAttributeGroup(attr);
+ attributeGroup.getRAttributeAttributeGroup(attr);
Group raagGroup = intake.get("RAttributeAttributeGroup",
raag.getQueryKey(), false);
raagGroup.setProperties(raag);
Modified: trunk/src/java/org/tigris/scarab/actions/admin/ManagePermissions.java
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/java/org/tigris/scarab/actions/admin/ManagePermissions.java?view=diff&rev=10257&p1=trunk/src/java/org/tigris/scarab/actions/admin/ManagePermissions.java&p2=trunk/src/java/org/tigris/scarab/actions/admin/ManagePermissions.java&r1=10256&r2=10257
==============================================================================
--- trunk/src/java/org/tigris/scarab/actions/admin/ManagePermissions.java (original)
+++ trunk/src/java/org/tigris/scarab/actions/admin/ManagePermissions.java 2006-08-07 15:43:30-0700
@@ -61,6 +61,7 @@
// Scarab Stuff
import org.tigris.scarab.om.ScarabUser;
+import org.tigris.scarab.om.ScarabUserManager;
import org.tigris.scarab.tools.ScarabLocalizationTool;
import org.tigris.scarab.util.ScarabConstants;
import org.tigris.scarab.actions.base.RequireLoginFirstAction;
@@ -147,6 +148,8 @@
Permission permission = TurbineSecurity.getPermission(name);
TurbineSecurity.removePermission(permission);
+ ScarabUserManager.getMethodResult().clear();
+
ScarabLocalizationTool l10n = getLocalizationTool(context);
String msg = l10n.format("PermissionDeleted", name);
getScarabRequestTool(context).setConfirmMessage(msg);
Modified: trunk/src/java/org/tigris/scarab/actions/admin/ManageRoles.java
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/java/org/tigris/scarab/actions/admin/ManageRoles.java?view=diff&rev=10257&p1=trunk/src/java/org/tigris/scarab/actions/admin/ManageRoles.java&p2=trunk/src/java/org/tigris/scarab/actions/admin/ManageRoles.java&r1=10256&r2=10257
==============================================================================
--- trunk/src/java/org/tigris/scarab/actions/admin/ManageRoles.java (original)
+++ trunk/src/java/org/tigris/scarab/actions/admin/ManageRoles.java 2006-08-07 15:43:30-0700
@@ -62,6 +62,7 @@
// Scarab Stuff
import org.tigris.scarab.om.ScarabUser;
+import org.tigris.scarab.om.ScarabUserManager;
import org.tigris.scarab.tools.ScarabLocalizationTool;
import org.tigris.scarab.util.ScarabConstants;
import org.tigris.scarab.actions.base.RequireLoginFirstAction;
@@ -204,6 +205,8 @@
role.revoke(permission);
}
}
+
+ ScarabUserManager.getMethodResult().clear();
}
/**
Modified: trunk/src/java/org/tigris/scarab/notification/NotificationManager.java
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/java/org/tigris/scarab/notification/NotificationManager.java?view=diff&rev=10257&p1=trunk/src/java/org/tigris/scarab/notification/NotificationManager.java&p2=trunk/src/java/org/tigris/scarab/notification/NotificationManager.java&r1=10256&r2=10257
==============================================================================
--- trunk/src/java/org/tigris/scarab/notification/NotificationManager.java (original)
+++ trunk/src/java/org/tigris/scarab/notification/NotificationManager.java 2006-08-07 15:43:30-0700
@@ -3,6 +3,7 @@
import java.util.Set;
import org.tigris.scarab.om.ActivitySet;
+import org.tigris.scarab.om.ScarabUser;
import org.tigris.scarab.notification.ActivityType;
import org.tigris.scarab.om.Issue;
import org.tigris.scarab.util.EmailContext;
@@ -53,10 +54,11 @@
* The activity set describing the event
* @param issue
* The issue affected by the event
+ * @param fromUser TODO
* @see #addActivityNotification(NotificationEvent, EmailContext, ActivitySet, Issue, Set, Set)
*/
public void addActivityNotification(ActivityType event,
- ActivitySet activitySet, Issue issue);
+ ActivitySet activitySet, Issue issue, ScarabUser fromUser);
/**
* Long version of the addActivityNotification method, allowing to pass the sets of
@@ -72,11 +74,12 @@
* List of users intended to be notified as 'To:'
* @param ccUsers
* List of users intended to be notified in 'CC:'
- * @see #addActivityNotification(NotificationEvent, ActivitySet, Issue)
+ * @param fromUser TODO
+ * @see #addActivityNotification(NotificationEvent, ActivitySet, Issue, ScarabUser)
*/
public void addActivityNotification(ActivityType event,
ActivitySet activitySet, Issue issue,
- Set toUsers, Set ccUsers);
+ Set toUsers, Set ccUsers, ScarabUser fromUser);
/**
* Implementations of this method should provide the means to send the
Modified: trunk/src/java/org/tigris/scarab/notification/ScarabNewNotificationManager.java
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/java/org/tigris/scarab/notification/ScarabNewNotificationManager.java?view=diff&rev=10257&p1=trunk/src/java/org/tigris/scarab/notification/ScarabNewNotificationManager.java&p2=trunk/src/java/org/tigris/scarab/notification/ScarabNewNotificationManager.java&r1=10256&r2=10257
==============================================================================
--- trunk/src/java/org/tigris/scarab/notification/ScarabNewNotificationManager.java (original)
+++ trunk/src/java/org/tigris/scarab/notification/ScarabNewNotificationManager.java 2006-08-07 15:43:30-0700
@@ -55,7 +55,7 @@
import java.util.Map;
import java.util.Set;
import java.util.List;
-
+import java.util.StringTokenizer;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
@@ -67,13 +67,18 @@
import org.tigris.scarab.om.Activity;
import org.tigris.scarab.om.ActivitySet;
import org.tigris.scarab.notification.ActivityType;
+import org.tigris.scarab.om.Attribute;
import org.tigris.scarab.om.AttributePeer;
+import org.tigris.scarab.om.AttributeValue;
+import org.tigris.scarab.om.GlobalParameterManager;
import org.tigris.scarab.om.Issue;
import org.tigris.scarab.om.IssueManager;
+import org.tigris.scarab.om.Module;
import org.tigris.scarab.om.NotificationFilterManager;
import org.tigris.scarab.om.NotificationStatus;
import org.tigris.scarab.om.NotificationStatusPeer;
import org.tigris.scarab.om.ScarabUser;
+import org.tigris.scarab.om.ScarabUserImpl;
import org.tigris.scarab.tools.localization.L10NKey;
import org.tigris.scarab.tools.localization.L10NKeySet;
import org.tigris.scarab.tools.localization.L10NMessage;
@@ -112,14 +117,15 @@
* filtering.
*/
public void addActivityNotification(ActivityType event,
- ActivitySet activitySet, Issue issue)
+ ActivitySet activitySet, Issue issue, ScarabUser fromUser)
{
this.addActivityNotification(
event,
activitySet,
issue,
null,
- null);
+ null,
+ fromUser);
}
/**
@@ -127,12 +133,12 @@
* users involved as 'To' or 'CC'.
*/
public void addActivityNotification(ActivityType event, ActivitySet activitySet, Issue issue,
- Set toUsers, Set ccUsers)
+ Set toUsers, Set ccUsers, ScarabUser fromUser)
{
if (log.isDebugEnabled())
log.debug("addActivityNotification: " + issue.getIdPrefix()
+ issue.getIssueId() + "-" + event.getCode());
- this.queueNotifications(activitySet, issue);
+ this.queueNotifications(activitySet, issue, fromUser);
}
/**
@@ -140,7 +146,7 @@
*
* @param activitySet
*/
- private void queueNotifications(ActivitySet activitySet, Issue issue)
+ private void queueNotifications(ActivitySet activitySet, Issue issue, ScarabUser fromUser)
{
try
{
@@ -149,17 +155,13 @@
Activity act = (Activity)it.next();
if (act.getIssue().equals(issue))
{
- Set users = act.getIssue().getAllUsersToEmail(AttributePeer.EMAIL_TO);
- users.addAll(act.getIssue().getAllUsersToEmail(AttributePeer.CC_TO));
+ Issue actIssue = act.getIssue();
+ Set users = issue.getAllUsersToEmail(AttributePeer.EMAIL_TO);
+ users.addAll(actIssue.getAllUsersToEmail(AttributePeer.CC_TO));
+
// FIXME: Should we still make difference between CC & TO? If so...
// ...do we need this info in the notification_status table??
- // FIXME: Should we call the ActivityFilter here to discover every user
- // interested in this issue, beyond those directly assigned to it?
- // Who would that be ? What algorythm shoul be used at all ?
- // The NotificationFiltering has no association to issues, so maybe
- // this fixme is obsolete now and can be removed? [HD,17-nov-2005]
-
// FIXME: SCB1439. does the user really have permissions
// to view this attribute?
@@ -169,7 +171,18 @@
ScarabUser user = (ScarabUser)itusers.next();
String activityType = act.getActivityType();
Integer userId = user.getUserId();
- boolean wantsNotification = NotificationFilterManager.isNotificationEnabledFor(moduleId, userId, activityType);
+ boolean wantsNotification;
+ if(userId != null)
+ {
+ boolean isSelf = userId.equals(fromUser.getUserId());
+ wantsNotification = NotificationFilterManager.isNotificationEnabledFor(moduleId, userId, isSelf, activityType);
+ }
+ else
+ {
+ // users without userId are considered to be email archivers, who always want notifications.
+ wantsNotification = true;
+ }
+
if(wantsNotification)
{
NotificationStatus notification = new NotificationStatus(user, act);
@@ -206,6 +219,7 @@
Map pendingIssueMap = getPendingIssueMap(pending);
Map issueActivities = new HashMap();
+ Map archiverActivities = new HashMap();
Set creators = new HashSet();
NotificationStatus firstNotification;
NotificationStatus lastNotification;
@@ -218,10 +232,12 @@
String issueId = "???";
// clear volatile data structures ...
issueActivities.clear();
+ archiverActivities.clear();
creators.clear();
firstNotification = null;
lastNotification = null;
Long issueTime = null;
+ String changedStatusAttributeValue = "";
Set notificationSet = (Set)pendingIssueMap.get(issue);
@@ -229,18 +245,49 @@
for (Iterator it = notificationSet.iterator(); it.hasNext();)
{
NotificationStatus currentNotification = (NotificationStatus) it.next();
+
+ ActivityType activityType = currentNotification.getActivityType();
+ if(changedStatusAttributeValue.length() == 0 && activityType.equals(ActivityType.ATTRIBUTE_CHANGED))
+ {
+ try
+ {
+ Attribute attribute = currentNotification.getActivity().getAttribute();
+ if (getIsStatusAttribute(attribute, issue))
+ {
+ String name = attribute.getName();
+ AttributeValue av = issue.getAttributeValue(name);
+ if(av != null)
+ {
+ changedStatusAttributeValue = av.getValue();
+ }
+ }
+ }
+ catch (TorqueException e)
+ {
+ Log.get().warn("Database acess error while retrieving status attribute value.(ignored)");
+ Log.get().warn("db layer reported: ["+e.getMessage()+"]");
+ }
+ }
+
firstNotification = getOldestNotification(currentNotification, firstNotification);
lastNotification = getYoungestNotification(currentNotification, lastNotification);
-
try
{
issueId = issue.getUniqueId();
- ScarabUser receiver = currentNotification.getReceiver();
+ ScarabUser receiver=null;
+ try
+ {
+ receiver = currentNotification.getReceiver();
+ }
+ catch(TorqueException te)
+ {
+ log.warn("current notification has no reciever.");
+ }
creators.add(currentNotification.getCreator());
- Map userNotifications = getNotificationsForUser(issueActivities, receiver);
- addNotification(currentNotification, userNotifications);
-
+ Map userActivities = getActivitiesForUser(issueActivities, receiver);
+ addActivity(currentNotification, userActivities);
+ addActivity(currentNotification, archiverActivities);
issueTime = adjustTimeToNewer(issueTime, currentNotification);
}
catch (TorqueException te)
@@ -258,11 +305,17 @@
if (isOldEnough(issueTime))
{
log.debug("processing notifications for issue : ["+issueId+"]");
- Iterator userIterator = issueActivities.keySet().iterator();
+ Iterator userIterator = getUsersToNotifyIterator(issue, issueActivities);
+ Map notifiedUserMailAdresses = new HashMap();
while( userIterator.hasNext())
{
ScarabUser user = (ScarabUser) userIterator.next();
-
+ String emailAdress = user.getEmail();
+ if(userAlreadyNotified(emailAdress,notifiedUserMailAdresses))
+ {
+ continue;
+ }
+ notifiedUserMailAdresses.put(emailAdress,user);
// Prepare E-Mail context ...
EmailContext ectx = new EmailContext();
ectx.put("issue", issue);
@@ -270,22 +323,14 @@
ectx.put("creators", creators);
ectx.put("firstNotification", firstNotification);
ectx.put("lastNotification", lastNotification);
-
+ ectx.put("changedStatus",changedStatusAttributeValue);
Map groupedActivities = (Map) issueActivities.get(user);
- ectx.put("ActivityIssue", groupedActivities
- .get(L10NKeySet.ActivityIssue));
- ectx.put("ActivityAttributeChanges", groupedActivities
- .get(L10NKeySet.ActivityAttributeChanges));
- ectx.put("ActivityPersonnelChanges", groupedActivities
- .get(L10NKeySet.ActivityPersonnelChanges));
- ectx.put("ActivityComments", groupedActivities
- .get(L10NKeySet.ActivityComments));
- ectx.put("ActivityAssociatedInfo", groupedActivities
- .get(L10NKeySet.ActivityAssociatedInfo));
- ectx.put("ActivityDependencies", groupedActivities
- .get(L10NKeySet.ActivityDependencies));
- ectx.put("ActivityReasons", consolidateActivityReasons(groupedActivities));
-
+ if(groupedActivities == null)
+ {
+ groupedActivities = archiverActivities;
+ }
+ addActivitiesToEmailContext(ectx, groupedActivities);
+
Exception exception = null;
try
{
@@ -298,6 +343,7 @@
updateNotificationRepository(groupedActivities, exception);
}
+
}
else
{
@@ -317,6 +363,139 @@
log.debug("sendPendingNotifications(): ...finished!");
}
+
+ /**
+ * This method returns true, if the attribute is identified as
+ * the "status_attribute" for the current module/issue_type combination.
+ *
+ * NOTE: The "status_attribute" id is searched in SCARAB_GLOBAL_ATTRIBUTE
+ * first, although it currently should not find any entry there. In a future
+ * release it is intended to allow a more sophisticated controll over what
+ * a status attribute is and how it should be rendered e.g. into email subject.
+ *
+ * @param attribute
+ * @param issue
+ * @return
+ * @throws TorqueException
+ */
+ private boolean getIsStatusAttribute(Attribute attribute, Issue issue)
+ throws TorqueException
+ {
+ boolean result=false;
+ Module module = issue.getModule();
+ String key = "status_attribute_"+attribute.getAttributeId();
+
+ String statusId = GlobalParameterManager.getString(key,module);
+ if(!statusId.equals(""))
+ {
+ result = true; // the attribute IS the status_attribute
+ }
+ else
+ {
+ String name = attribute.getName().toLowerCase();
+ String globalStatusAttributeName = GlobalParameterManager.getString("scarab.common.status.id").toLowerCase();
+ if(name.equals(globalStatusAttributeName))
+ {
+ result=true;
+ }
+ }
+ return result;
+ }
+
+
+
+ /**
+ * @param ectx
+ * @param groupedActivities
+ */
+ private void addActivitiesToEmailContext(EmailContext ectx, Map groupedActivities)
+ {
+ ectx.put("ActivityIssue", groupedActivities
+ .get(L10NKeySet.ActivityIssue));
+ ectx.put("ActivityAttributeChanges", groupedActivities
+ .get(L10NKeySet.ActivityAttributeChanges));
+ ectx.put("ActivityPersonnelChanges", groupedActivities
+ .get(L10NKeySet.ActivityPersonnelChanges));
+ ectx.put("ActivityComments", groupedActivities
+ .get(L10NKeySet.ActivityComments));
+ ectx.put("ActivityAssociatedInfo", groupedActivities
+ .get(L10NKeySet.ActivityAssociatedInfo));
+ ectx.put("ActivityDependencies", groupedActivities
+ .get(L10NKeySet.ActivityDependencies));
+ ectx.put("ActivityReasons", consolidateActivityReasons(groupedActivities));
+ }
+
+
+ /**
+ * @param issueActivities
+ * @return
+ */
+ private Iterator getUsersToNotifyIterator(Issue issue, Map issueActivities)
+ {
+ List userlist = new ArrayList();
+
+ Iterator userIterator = issueActivities.keySet().iterator();
+ while(userIterator.hasNext())
+ {
+ ScarabUser user = (ScarabUser)userIterator.next();
+ userlist.add(user);
+ }
+
+ userlist.addAll(getArchiveUsers(issue));
+
+ Iterator usersToNotifyIterator = userlist.iterator();
+ return usersToNotifyIterator;
+ }
+
+
+ /**
+ * @param issue
+ */
+ private Set getArchiveUsers(Issue issue)
+ {
+ Set userSet = new HashSet();
+ try
+ {
+ String archiveEmail = issue.getModule().getArchiveEmail();
+ if (archiveEmail != null && archiveEmail.trim().length() == 0)
+ {
+ archiveEmail = null;
+ }
+ if (archiveEmail != null)
+ {
+ List expandedArchive = expandMultipleAddresses(archiveEmail);
+ for (Iterator iter = expandedArchive.iterator(); iter.hasNext(); )
+ {
+ String ccTarget = (String)iter.next();
+ ScarabUser otherUser = new ScarabUserImpl();
+ otherUser.setEmail(ccTarget);
+ userSet.add(otherUser);
+ }
+ }
+ }
+ catch(TorqueException te)
+ {
+ log.warn("Could not notify archive ["+te.getMessage()+"]");
+ }
+ return userSet;
+ }
+
+
+ private boolean userAlreadyNotified(String emailAdress, Map notifiedUserMailAdresses)
+ {
+ ScarabUser user = (ScarabUser)notifiedUserMailAdresses.get(emailAdress);
+ boolean result;
+ if(user != null)
+ {
+ result = true;
+ }
+ else
+ {
+ result = false;
+ }
+ return result;
+ }
+
/**
* Return the Notification which is the youngest of n1,n2
@@ -516,7 +695,7 @@
* @param user
* @return
*/
- private Map getNotificationsForUser(Map issueActivities, ScarabUser user)
+ private Map getActivitiesForUser(Map issueActivities, ScarabUser user)
{
Map userActivities = (Map) issueActivities.get(user);
if (null == userActivities)
@@ -532,7 +711,7 @@
* @param notification
* @param userActivities
*/
- private void addNotification(NotificationStatus notification, Map userActivities)
+ private void addActivity(NotificationStatus notification, Map userActivities)
{
LocalizationKey activityGroup = getActivityGroup(notification.getActivityType());
List typeNotifications = (List) userActivities.get(activityGroup);
@@ -624,6 +803,7 @@
String[] fromUser = getFromUser(issue, context);
String[] replyToUser = issue.getModule().getSystemEmail();
+
Email.sendEmail(
context,
issue.getModule(),
@@ -634,6 +814,16 @@
"notification/IssueActivity.vm");
}
+ private static List expandMultipleAddresses(String addresses)
+ {
+ List expanded = new ArrayList();
+ StringTokenizer st = new StringTokenizer(addresses, ",;");
+ while (st.hasMoreTokens())
+ expanded.add(st.nextToken().trim());
+ return expanded;
+ }
+
+
private String[] getFromUser(Issue issue, EmailContext context) throws TorqueException
{
String[] replyToUser = null;
@@ -690,9 +880,8 @@
* @param type The type for which we want to get the corresponding group's name
* @return
*/
- private LocalizationKey getActivityGroup(String activityCode)
+ private LocalizationKey getActivityGroup(ActivityType activityType)
{
- ActivityType activityType = ActivityType.getActivityType(activityCode);
L10NKey key = (L10NKey)typeDescriptions.get(activityType.getCode());
return key;
}
Modified: trunk/src/java/org/tigris/scarab/notification/ScarabNotificationManager.java
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/java/org/tigris/scarab/notification/ScarabNotificationManager.java?view=diff&rev=10257&p1=trunk/src/java/org/tigris/scarab/notification/ScarabNotificationManager.java&p2=trunk/src/java/org/tigris/scarab/notification/ScarabNotificationManager.java&r1=10256&r2=10257
==============================================================================
--- trunk/src/java/org/tigris/scarab/notification/ScarabNotificationManager.java (original)
+++ trunk/src/java/org/tigris/scarab/notification/ScarabNotificationManager.java 2006-08-07 15:43:30-0700
@@ -1,267 +1,72 @@
package org.tigris.scarab.notification;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-import java.util.List;
-
-import org.apache.log4j.Logger;
-import org.apache.torque.TorqueException;
-import org.apache.turbine.Turbine;
-import org.tigris.scarab.om.Activity;
-import org.tigris.scarab.om.ActivitySet;
-import org.tigris.scarab.notification.ActivityType;
-import org.tigris.scarab.om.Attachment;
-import org.tigris.scarab.om.AttributePeer;
-import org.tigris.scarab.om.Issue;
-import org.tigris.scarab.om.ScarabUser;
-import org.tigris.scarab.util.Email;
-import org.tigris.scarab.util.EmailContext;
-import org.tigris.scarab.util.Log;
+/* ================================================================
+ * Copyright (c) 2000-2005 CollabNet. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ * any, must include the following acknowlegement: "This product includes
+ * software developed by CollabNet <http://www.Collab.Net/>."
+ * Alternately, this acknowlegement may appear in the software itself, if
+ * and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The hosted project names must not be used to endorse or promote
+ * products derived from this software without prior written
+ * permission. For written permission, please contact [email protected].
+ *
+ * 5. Products derived from this software may not use the "Tigris" or
+ * "Scarab" names nor may "Tigris" or "Scarab" appear in their names without
+ * prior written permission of CollabNet.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL COLLAB.NET OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of CollabNet.
+ */
/**
- * This class provides the default implementation for the provided notification
- * manager. It just send the notifications by email in the moment they are added.
+ * This class is for backward compatibility. It is only for delegating
+ * functionality to the new scarab notification manager. The preferred
+ * method of utilisation is via configuration. please see
+ * property "scarab.notificationmanager.classname" for further
+ * information.
+ * <br/>
*
* @author jorgeuriarte
*/
-public class ScarabNotificationManager implements NotificationManager
+public class ScarabNotificationManager extends ScarabNewNotificationManager
{
- public static Logger log = Log.get(ScarabNotificationManager.class
- .getName());
-
- private static final Integer NOTIFICATION_MANAGER_ID = new Integer(1);
- public Integer getManagerId()
- {
- return NOTIFICATION_MANAGER_ID;
- }
- /**
- * Receives an activitySet from which to generate notification. Current
- * implementation does only online email sending, with no aggregation or
- * filtering.
- */
- public void addActivityNotification(ActivityType event,
- ActivitySet activitySet, Issue issue)
- {
- this.addActivityNotification(
- event,
- activitySet,
- issue,
- null,
- null);
- }
-
- /**
- * Long version of the addActivityNotification method, allowing to pass the sets of
- * users involved as 'To' or 'CC'.
- */
- public void addActivityNotification(ActivityType event, ActivitySet activitySet, Issue issue,
- Set toUsers, Set ccUsers)
- {
- if (log.isDebugEnabled())
- log.debug("addActivityNotification: " + issue.getIdPrefix()
- + issue.getIssueId() + "-" + event);
-
- Attachment activityAttch = null;
- Set changes = null;
- try
- {
- activityAttch = activitySet.getAttachment();
- List activityList = activitySet.getActivityList();
- changes = new HashSet(activityList.size());
- for (Iterator itr = activityList.iterator(); itr.hasNext();)
- {
- Activity activity = (Activity) itr.next();
- if (activity.getIssue().equals(issue))
- {
- changes.add(activity);
- }
- }
- }
- catch (Exception e)
- {
- log.error("addActivityNotification: Error accessing activityset: "
- + e);
- }
- EmailContext ectx = new EmailContext();
- ectx.setIssue(issue);
- ectx.put("attachment", activityAttch);
- ectx.put("uniqueActivityDescriptions", changes);
-
- String template = configureEmailContext(ectx, event, activitySet, issue);
-
- try
- {
- // FIXME: This should really be 'queued', delaying the sending
- // untill sendPendingNotifications is called
- this.sendEmail(changes, activityAttch, ectx, issue, activitySet
- .getCreator(), toUsers, ccUsers, template);
- }
- catch (Exception e)
- {
- log.error("addNotification: " + e);
- }
- }
-
- /**
- * Does nothing, because this implementation currently send the
- * notifications online in the moment they are generated calling
- * addActivityNotification methods.
- */
- public void sendPendingNotifications()
- {
- log.debug("sendPendingNotifications(): No implementation required.");
- }
-
- /**
- * Decides what templates to use for email, and set needed values in the
- * context, depending on the event that originated the notification.
- *
- * @param event
- * The NotificationEvent originated
- * @param ectx
- * Returned initialized/updated by reference
- * @return The name of the email template to be used
- */
- private String configureEmailContext(EmailContext ectx, ActivityType event,
- ActivitySet acttivitySet, Issue issue)
- {
- String template = null;
-
- // Select appropiate template depending on the event
- if (event == ActivityType.USER_ATTRIBUTE_CHANGED)
- {
- template = Turbine.getConfiguration().getString(
- "scarab.email.assignissue.template",
- "ModifyIssue.vm");
-
- ectx.setSubjectTemplate("AssignIssueModifyIssueSubject.vm");
- }
- else if (event == ActivityType.ISSUE_CREATED)
- {
- template = Turbine.getConfiguration().getString(
- "scarab.email.reportissue.template",
- "NewIssueNotification.vm");
- }
- else if (event == ActivityType.ISSUE_MOVED || event == ActivityType.ISSUE_COPIED)
- {
- template = Turbine.getConfiguration().getString(
- "scarab.email.moveissue.template",
- "MoveIssue.vm");
- ectx.setDefaultTextKey("MovedIssueEmailSubject");
-
- // placed in the context for the email to be able to access them
- // from within the email template
- try
- {
- Issue newIssue = ((Activity)acttivitySet.getActivitys().get(0)).getIssue();
- ectx.put("issue", newIssue);
- ectx.put("module", newIssue.getModule());
- ectx.setModule(newIssue.getModule());
- Attachment reason = acttivitySet.getAttachment();
- ectx.put("reason", (reason == null)?"[no reason provided]":reason.getData());
- ectx.put("oldModule", issue.getModule());
- ectx.put("oldIssueType", issue.getIssueType());
- ectx.put("oldIssue", issue);
- if (event == ActivityType.ISSUE_COPIED)
- ectx.put("action", "copy");
- else
- ectx.put("action", "move");
- }
- catch (TorqueException te)
- {
- Log.get(this.getClass().getName()).error(
- "configureEmailContext: Can't get the issues from activitySet="
- + acttivitySet.getActivitySetId());
- }
-
- if (event == ActivityType.ISSUE_COPIED)
- ectx.setDefaultTextKey("CopiedIssueEmailSubject");
- else
- ectx.setDefaultTextKey("MovedIssueEmailSubject");
- }
- else if (event == ActivityType.ATTACHMENT_CREATED)
- {
- template = Turbine.getConfiguration().getString(
- "scarab.email.modifyissue.template",
- "ModifyIssue.vm");
- }
- else
- {
- /** Rest of cases will use, by default, ModifyIssue.vm * */
- template = Turbine.getConfiguration().getString(
- "scarab.email.modifyissue.template",
- "ModifyIssue.vm");
- ectx.setDefaultTextKey("DefaultModifyIssueEmailSubject");
- }
- return template;
- }
-
- /**
- * Sends email to the users associated with the issue. That is associated
- * with this activitySet. If no subject and template specified, assume
- * modify issue action. throws Exception
- *
- * @param activityDesc
- * Set containing the different descriptions of this activityset
- * @param attachment
- * Attachment of the activityset (if present)
- * @param context
- * Any contextual information for the message.
- * @param issue
- * The issue
- * @param creator
- * The user originating the notification event
- * @param toUsers
- * @param ccUsers
- * @param template
- * The name of the velocity template containing the mail text
- */
- private void sendEmail(Set activityDesc, Attachment attachment,
- EmailContext context, Issue issue, ScarabUser creator,
- Collection toUsers, Collection ccUsers, String template)
- throws Exception
- {
- // add data to context
-
- if (toUsers == null)
- {
- // Then add users who are assigned to "email-to" attributes
- toUsers = issue.getAllUsersToEmail(AttributePeer.EMAIL_TO);
- }
-
- if (ccUsers == null)
- {
- // add users to cc field of email
- ccUsers = issue.getAllUsersToEmail(AttributePeer.CC_TO);
- }
-
- String[] replyToUser = issue.getModule().getSystemEmail();
-
- if (Turbine.getConfiguration().getString("scarab.email.replyto.sender")
- .equals("true"))
- {
- Email.sendEmail(
- context,
- issue.getModule(),
- creator,
- creator,
- toUsers,
- ccUsers,
- template);
- }
- else
- {
- Email.sendEmail(
- context,
- issue.getModule(),
- creator,
- replyToUser,
- toUsers,
- ccUsers,
- template);
- }
- }
-
+ /**
+ * Important note:
+ * If you want to utilise the old NotificationManager available
+ * before release b21, please customize your properties as:
+ *
+ * scarab.notificationmanager.classname=tigris.scarab.notification.ScarabOldNotificationManager
+ *
+ * We recommend to NOT use the old notification manager implementation.
+ * We only keep it for backward compatibility. The old implementation
+ * may be removed in a later release.
+ */
}
Modified: trunk/src/java/org/tigris/scarab/om/AbstractScarabModule.java
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/java/org/tigris/scarab/om/AbstractScarabModule.java?view=diff&rev=10257&p1=trunk/src/java/org/tigris/scarab/om/AbstractScarabModule.java&p2=trunk/src/java/org/tigris/scarab/om/AbstractScarabModule.java&r1=10256&r2=10257
==============================================================================
--- trunk/src/java/org/tigris/scarab/om/AbstractScarabModule.java (original)
+++ trunk/src/java/org/tigris/scarab/om/AbstractScarabModule.java 2006-08-07 15:43:30-0700
@@ -1128,20 +1128,15 @@
throws TorqueException
{
Criteria crit = new Criteria();
- crit.add(AttributePeer.ATTRIBUTE_TYPE_ID, 5);
crit.addJoin(RModuleAttributePeer.ATTRIBUTE_ID,
AttributePeer.ATTRIBUTE_ID);
- crit.add(RModuleAttributePeer.MODULE_ID, getModuleId());
+ crit.add(AttributePeer.ATTRIBUTE_TYPE_ID, 5);
crit.add(AttributePeer.DELETED, false);
crit.add(RModuleAttributePeer.ACTIVE, true);
+ crit.add(RModuleAttributePeer.MODULE_ID, getModuleId());
crit.addAscendingOrderByColumn(
RModuleAttributePeer.DISPLAY_VALUE);
- //crit.addAscendingOrderByColumn(
- // RModuleAttributePeer.PREFERRED_ORDER);
- crit.addGroupByColumn(AttributePeer.ATTRIBUTE_ID);
- //crit.setDistinct(); // need this here, because otherwise duplicate attributes are returned
- // FIXME: Mazbe it is possible to create a query without the distinct,
- // but i don't seem to get it managed... [HD]
+ crit.setDistinct();
List result = AttributePeer.doSelect(crit);
return result;
}
Modified: trunk/src/java/org/tigris/scarab/om/AbstractScarabUser.java
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/java/org/tigris/scarab/om/AbstractScarabUser.java?view=diff&rev=10257&p1=trunk/src/java/org/tigris/scarab/om/AbstractScarabUser.java&p2=trunk/src/java/org/tigris/scarab/om/AbstractScarabUser.java&r1=10256&r2=10257
==============================================================================
--- trunk/src/java/org/tigris/scarab/om/AbstractScarabUser.java (original)
+++ trunk/src/java/org/tigris/scarab/om/AbstractScarabUser.java 2006-08-07 15:43:30-0700
@@ -770,6 +770,10 @@
{
homePage = getQueryTarget();
}
+ else if ("matrix".equals(homePage))
+ {
+ homePage = getMatrixTarget();
+ }
// protect against removal of old screens
else if (homePage != null &&
(homePage.endsWith("ModuleQuery.vm") ||
@@ -864,6 +868,12 @@
return target;
}
+ public String getMatrixTarget()
+ {
+ String target = "QueryMatrix.vm";
+ return target;
+ }
+
/**
* @see ScarabUser#setSingleIssueTypeQueryTarget(IssueType, String)
*/
@@ -950,14 +960,49 @@
public List getUnusedRModuleIssueTypes(Module module)
throws TorqueException
{
- Criteria crit = new Criteria();
- crit.add(RModuleIssueTypePeer.MODULE_ID, module.getModuleId())
- .addJoin(RModuleIssueTypePeer.ISSUE_TYPE_ID,
- IssueTypePeer.ISSUE_TYPE_ID)
- .add(IssueTypePeer.PARENT_ID, 0)
- .add(IssueTypePeer.DELETED, false);
- addCurrentMITListExclusion(crit);
- return RModuleIssueTypePeer.doSelect(crit);
+ List result;
+ if(module == null)
+ {
+ result = Collections.EMPTY_LIST;
+ }
+ else
+ {
+ Criteria crit = new Criteria();
+ crit.add(RModuleIssueTypePeer.MODULE_ID, module.getModuleId())
+ .addJoin(RModuleIssueTypePeer.ISSUE_TYPE_ID,
+ IssueTypePeer.ISSUE_TYPE_ID)
+ .add(IssueTypePeer.PARENT_ID, 0)
+ .add(IssueTypePeer.DELETED, false);
+ addCurrentMITListExclusion(crit);
+ result = RModuleIssueTypePeer.doSelect(crit);
+ }
+ return result;
+ }
+
+
+
+ /**
+ * @see ScarabUser#getAllRModuleIssueTypes(Module).
+ */
+ public List getAllRModuleIssueTypes(Module module)
+ throws TorqueException
+ {
+ List result;
+ if(module == null)
+ {
+ result = Collections.EMPTY_LIST;
+ }
+ else
+ {
+ Criteria crit = new Criteria();
+ crit.add(RModuleIssueTypePeer.MODULE_ID, module.getModuleId())
+ .addJoin(RModuleIssueTypePeer.ISSUE_TYPE_ID,
+ IssueTypePeer.ISSUE_TYPE_ID)
+ .add(IssueTypePeer.PARENT_ID, 0)
+ .add(IssueTypePeer.DELETED, false);
+ result = RModuleIssueTypePeer.doSelect(crit);
+ }
+ return result;
}
Modified: trunk/src/java/org/tigris/scarab/om/Activity.java
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/java/org/tigris/scarab/om/Activity.java?view=diff&rev=10257&p1=trunk/src/java/org/tigris/scarab/om/Activity.java&p2=trunk/src/java/org/tigris/scarab/om/Activity.java&r1=10256&r2=10257
==============================================================================
--- trunk/src/java/org/tigris/scarab/om/Activity.java (original)
+++ trunk/src/java/org/tigris/scarab/om/Activity.java 2006-08-07 15:43:30-0700
@@ -493,9 +493,9 @@
if (this.getAttribute().isDateAttribute())
{
if (null != newValue)
- newValue = DateAttribute.dateFormat(newValue, L10NKeySet.ShortDateDisplay.getMessage(l10nTool));
+ newValue = DateAttribute.dateFormat(newValue, L10NKeySet.ShortDatePattern.getMessage(l10nTool));
if (null != oldValue)
- oldValue = DateAttribute.dateFormat(oldValue, L10NKeySet.ShortDateDisplay.getMessage(l10nTool));
+ oldValue = DateAttribute.dateFormat(oldValue, L10NKeySet.ShortDatePattern.getMessage(l10nTool));
}
}
catch (Exception e)
Modified: trunk/src/java/org/tigris/scarab/om/GlobalParameter.java
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/java/org/tigris/scarab/om/GlobalParameter.java?view=diff&rev=10257&p1=trunk/src/java/org/tigris/scarab/om/GlobalParameter.java&p2=trunk/src/java/org/tigris/scarab/om/GlobalParameter.java&r1=10256&r2=10257
==============================================================================
--- trunk/src/java/org/tigris/scarab/om/GlobalParameter.java (original)
+++ trunk/src/java/org/tigris/scarab/om/GlobalParameter.java 2006-08-07 15:43:30-0700
@@ -68,5 +68,7 @@
"scarab.issue.edit.reason.required";
public static final String REQUIRED_ROLE_FOR_REQUESTING_ACCESS =
"required-role-for-requesting-access";
+ public static final String COMMENT_RENDER_ENGINE =
+ "comment-render-engine";
}
Modified: trunk/src/java/org/tigris/scarab/om/Issue.java
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/java/org/tigris/scarab/om/Issue.java?view=diff&rev=10257&p1=trunk/src/java/org/tigris/scarab/om/Issue.java&p2=trunk/src/java/org/tigris/scarab/om/Issue.java&r1=10256&r2=10257
==============================================================================
--- trunk/src/java/org/tigris/scarab/om/Issue.java (original)
+++ trunk/src/java/org/tigris/scarab/om/Issue.java 2006-08-07 15:43:30-0700
@@ -85,6 +85,7 @@
import org.tigris.scarab.services.security.ScarabSecurity;
import org.tigris.scarab.tools.ScarabGlobalTool;
import org.tigris.scarab.tools.localization.L10NKeySet;
+import org.tigris.scarab.tools.localization.L10NMessage;
import org.tigris.scarab.util.Log;
import org.tigris.scarab.util.MutableBoolean;
import org.tigris.scarab.util.ScarabConstants;
@@ -608,7 +609,7 @@
ActivityType.COMMENT_ADDED, attachment);
NotificationManagerFactory.getInstance().addActivityNotification(
- ActivityType.COMMENT_ADDED, activitySet, this);
+ ActivityType.COMMENT_ADDED, activitySet, this, user);
return activitySet;
}
@@ -881,39 +882,21 @@
}
}
- /**
- * This method is currently experimental.
- * It allows to retrieve the current status
- * of the issue regarding the options "new", "started","closed"
- * and so on. If for any reason the status
- * @return
- * @throws TorqueException
- */
- public String getEmailShortInfo()
- throws TorqueException
- {
- String result = "";
- String key = "status_attribute_"+this.getTypeId();
-
- String statusId = GlobalParameterManager.getString(key,this.getModule());
- if(!statusId.equals(""))
- {
- int sid = Integer.parseInt(statusId);
- AttributeValue av = getAttributeValue(sid);
- if(av != null)
- {
- result=av.getValue();
- }
- }
- return result;
- }
-
public AttributeValue getAttributeValue(String attributeName)
throws TorqueException
{
Attribute attribute = Attribute.getInstance(attributeName);
- return getAttributeValue(attribute);
+ AttributeValue result;
+ if(attribute == null)
+ {
+ result = null;
+ }
+ else
+ {
+ result = getAttributeValue(attribute);
+ }
+ return result;
}
public AttributeValue getAttributeValue(int id)
@@ -2049,6 +2032,15 @@
* Removes any unset attributes and sets the issue # prior to saving
* for the first time. Calls super.save()
*
+ * If the issue does not have an <i>idCount</i> then the next
+ * available ID is allocated.
+ *
+ * If the issue has a non-zero <i>idCount</i>, this value is honoured.
+ * WARNING: do not set the idCount to an existing ID!
+ * The nominated value is ignored if it is not at least as high as the
+ * next available ID.
+ *
+ *
* @param dbCon a <code>DBConnection</code> value
* @exception TorqueException if an error occurs
*/
@@ -2090,6 +2082,16 @@
{
try
{
+ final int suggestedID = getIdCount();
+ if (suggestedID != 0) {
+ // Force the next available issue ID to be the
+ // nominated value, if not out of sequence.
+ // TODO: assert that this issue doesn't already exist
+ // In this case, just skip the next action.
+ setNextIssueId(dbCon, suggestedID);
+ }
+
+ // Set the ID to the next available value.
setIdCount(getNextIssueId(dbCon));
}
catch (Exception e)
@@ -2100,7 +2102,10 @@
}
super.save(dbCon);
}
-
+
+ /* Gets the next available issue ID.
+ * If the ID table doesn't yet exist, it is created.
+ */
private int getNextIssueId(Connection con)
throws TorqueException, ScarabException
{
@@ -2126,7 +2131,7 @@
// entered, insert a row into the id_table and try again.
try
{
- saveIdTableKey(con);
+ saveIdTableKey(con, 2);
id = 1;
}
catch (Exception badException)
@@ -2148,6 +2153,56 @@
return id;
}
+ /*
+ * Sets the next available issue ID to the given value
+ * If the ID table doesn't yet exist, it is created.
+ */
+ private void setNextIssueId(Connection con, int newID)
+ throws TorqueException, ScarabException
+ {
+ String key = getIdTableKey();
+ DatabaseMap dbMap = IssuePeer.getTableMap().getDatabaseMap();
+ IDBroker idbroker = dbMap.getIDBroker();
+ int nextID = 1;
+
+ synchronized (idbroker)
+ {
+ try
+ {
+ // Check if the ID table is available and get the next ID
+ nextID = idbroker.getIdAsInt(con, key);
+ }
+ catch (Exception idRetrievalErr) {
+ // No, create the ID table now
+ saveIdTableKey(con, nextID);
+ }
+
+ if (nextID > newID) {
+ getLog()
+ .error("New issue ID "+ newID
+ + "is out of sequence. Must be at least " + nextID);
+ }
+ else
+ {
+ try
+ {
+ // Now set the next available ID in the table
+ setIdTableKey(con, newID);
+ }
+ catch (Exception badException)
+ {
+ getLog()
+ .error("Error creating ID_TABLE entry for "
+ + getIdTableKey(), badException);
+ // throw the original
+ throw new ScarabException(
+ L10NKeySet.ExceptionRetrievingIssueId,
+ badException);
+ }
+ }
+ }
+ }
+
private String getIdTableKey()
throws TorqueException
{
@@ -2162,7 +2217,7 @@
return prefix;
}
- private void saveIdTableKey(final Connection dbCon)
+ private void saveIdTableKey(final Connection dbCon, final int nextID)
throws TorqueException
{
int id = 0;
@@ -2185,10 +2240,24 @@
// FIXME: UGLY! IDBroker doesn't have a Peer yet.
final String sql = "insert into " + idTable
+ " (ID_TABLE_ID,TABLE_NAME,NEXT_ID,QUANTITY) "
- + " VALUES (" + id + ",'" + key + "',2,1)" ;
+ + " VALUES (" + id + ",'" + key + "'," + nextID + ",1)" ;
BasePeer.executeStatement(sql, dbCon);
}
+ /*
+ * Sets the next available ID to the given ID
+ */
+ private void setIdTableKey(final Connection dbCon, int id)
+ throws TorqueException
+ {
+ final String key = getIdTableKey();
+
+ // FIXME: UGLY! IDBroker doesn't have a Peer yet.
+ final String sql = "update ID_TABLE set NEXT_ID=" + id
+ + " where TABLE_NAME='" + key + "'";
+ BasePeer.executeStatement(sql, dbCon);
+ }
+
/**
* Returns list of issue template types.
public List getTemplateTypes() throws TorqueException
@@ -2277,8 +2346,19 @@
{
for (Iterator it = nonmatching.iterator(); !bRdo && it.hasNext(); )
{
- UserAttribute userAttr = (UserAttribute)it.next();
- bRdo = userAttr.getUserName().equals(((UserAttribute)value).getUserName());
+ Object attr = it.next();
+ if (attr instanceof UserAttribute)
+ {
+ UserAttribute userAttr = (UserAttribute)attr;
+ bRdo = userAttr.getUserName().equals(((UserAttribute)value).getUserName());
+ }
+ else
+ {
+ Log.get().warn("in Issue.isNonMatchingAttribute: encountered an attribute of type ["
+ + attr.getClass().getName()
+ +"] in the list of nonmatching objects");
+ Log.get().warn("This is not a UserAttribute.(ignored)");
+ }
}
}
else
@@ -2851,7 +2931,7 @@
}
NotificationManagerFactory.getInstance()
.addActivityNotification(ActivityType.ISSUE_DELETED,
- activitySet, this);
+ activitySet, this, user);
}
save();
}
@@ -3322,7 +3402,7 @@
ActivityType.URL_DESC_CHANGED, attachment,
oldDescription, newDescription);
NotificationManagerFactory.getInstance().addActivityNotification(
- ActivityType.URL_DESC_CHANGED, activitySet, this);
+ ActivityType.URL_DESC_CHANGED, activitySet, this, user);
}
return activitySet;
}
@@ -3369,7 +3449,7 @@
newUrl);
NotificationManagerFactory.getInstance().addActivityNotification(
- ActivityType.URL_CHANGED, activitySet, this);
+ ActivityType.URL_CHANGED, activitySet, this, user);
}
return activitySet;
}
@@ -3476,8 +3556,8 @@
}
catch (ScarabException se)
{
- throw new TorqueException("Fatal Error: " +
- se.getMessage() + " Please start over."); //EXCEPTION
+ L10NMessage l10nmsg = new L10NMessage(L10NKeySet.ExceptionTorqueGeneric,se);
+ throw new ScarabException(l10nmsg);
}
}
this.save();
@@ -3726,7 +3806,7 @@
NotificationManagerFactory.getInstance().addActivityNotification(
ActivityType.COMMENT_CHANGED, activitySet,
- this);
+ this, user);
}
return activitySet;
}
Modified: trunk/src/java/org/tigris/scarab/om/IssueTemplateInfo.java
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/java/org/tigris/scarab/om/IssueTemplateInfo.java?view=diff&rev=10257&p1=trunk/src/java/org/tigris/scarab/om/IssueTemplateInfo.java&p2=trunk/src/java/org/tigris/scarab/om/IssueTemplateInfo.java&r1=10256&r2=10257
==============================================================================
--- trunk/src/java/org/tigris/scarab/om/IssueTemplateInfo.java (original)
+++ trunk/src/java/org/tigris/scarab/om/IssueTemplateInfo.java 2006-08-07 15:43:30-0700
@@ -86,9 +86,10 @@
{
// can delete a template if they have delete permission
// Or if is their personal template
- return (user.hasPermission(ScarabSecurity.ITEM__DELETE, getIssue().getModule())
- || (user.getUserId().equals(getIssue().getCreatedBy().getUserId())
- && getScopeId().equals(Scope.PERSONAL__PK)));
+ boolean hasPermission = user.hasPermission(ScarabSecurity.ITEM__DELETE, getIssue().getModule());
+ boolean isCreatedBySelf = user.getUserId().equals(getIssue().getCreatedBy().getUserId());
+ boolean hasScopePersonal = getScopeId().equals(Scope.PERSONAL__PK);
+ return (hasPermission || (isCreatedBySelf && hasScopePersonal));
}
public boolean canEdit(ScarabUser user)
Modified: trunk/src/java/org/tigris/scarab/om/MITListItem.java
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/java/org/tigris/scarab/om/MITListItem.java?view=diff&rev=10257&p1=trunk/src/java/org/tigris/scarab/om/MITListItem.java&p2=trunk/src/java/org/tigris/scarab/om/MITListItem.java&r1=10256&r2=10257
==============================================================================
--- trunk/src/java/org/tigris/scarab/om/MITListItem.java (original)
+++ trunk/src/java/org/tigris/scarab/om/MITListItem.java 2006-08-07 15:43:30-0700
@@ -129,6 +129,7 @@
crit.add(AttributeValuePeer.ATTRIBUTE_ID, attributeId);
crit.add(AttributeValuePeer.OPTION_ID,optionId);
+ crit.add(AttributeValuePeer.DELETED,0);
crit.add(IssuePeer.MODULE_ID,getModuleId());
crit.add(IssuePeer.TYPE_ID,this.getIssueTypeId());
crit.add(IssuePeer.MOVED, 0);
Modified: trunk/src/java/org/tigris/scarab/om/Module.java
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/java/org/tigris/scarab/om/Module.java?view=diff&rev=10257&p1=trunk/src/java/org/tigris/scarab/om/Module.java&p2=trunk/src/java/org/tigris/scarab/om/Module.java&r1=10256&r2=10257
==============================================================================
--- trunk/src/java/org/tigris/scarab/om/Module.java (original)
+++ trunk/src/java/org/tigris/scarab/om/Module.java 2006-08-07 15:43:30-0700
@@ -501,6 +501,11 @@
boolean allowsNewIssues();
/**
+ * Retruns the currently used rendering engine for comments
+ */
+ String getCommentRenderingEngine();
+
+ /**
* Determines whether this module accepts issues.
*/
boolean allowsIssues();
Modified: trunk/src/java/org/tigris/scarab/om/NotificationFilterManager.java
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/java/org/tigris/scarab/om/NotificationFilterManager.java?view=diff&rev=10257&p1=trunk/src/java/org/tigris/scarab/om/NotificationFilterManager.java&p2=trunk/src/java/org/tigris/scarab/om/NotificationFilterManager.java&r1=10256&r2=10257
==============================================================================
--- trunk/src/java/org/tigris/scarab/om/NotificationFilterManager.java (original)
+++ trunk/src/java/org/tigris/scarab/om/NotificationFilterManager.java 2006-08-07 15:43:30-0700
@@ -85,8 +85,8 @@
Issue issue = IssueManager.getInstance(issueId);
Integer moduleId = issue.getModuleId();
Integer userId = notif.getReceiverId();
- String activityType = notif.getActivityType();
- filter = getNotificationFilter(moduleId, userId, activityType);
+ ActivityType activityType = notif.getActivityType();
+ filter = getNotificationFilter(moduleId, userId, activityType.getCode());
}
catch(TorqueException te)
{
@@ -138,10 +138,18 @@
* @return
* @throws ScarabException
*/
- public static boolean isNotificationEnabledFor(Integer moduleId, Integer userId, String activityType) throws ScarabException
+ public static boolean isNotificationEnabledFor(Integer moduleId, Integer userId, boolean isSelf, String activityType) throws ScarabException
{
NotificationFilter filter = getNotificationFilter(moduleId, userId, activityType);
- boolean result = filter.getFilterState();
+ boolean result;
+ if(isSelf)
+ {
+ result = filter.getSendSelf();
+ }
+ else
+ {
+ result = filter.getFilterState();
+ }
return result;
}
Modified: trunk/src/java/org/tigris/scarab/om/NotificationStatus.java
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/java/org/tigris/scarab/om/NotificationStatus.java?view=diff&rev=10257&p1=trunk/src/java/org/tigris/scarab/om/NotificationStatus.java&p2=trunk/src/java/org/tigris/scarab/om/NotificationStatus.java&r1=10256&r2=10257
==============================================================================
--- trunk/src/java/org/tigris/scarab/om/NotificationStatus.java (original)
+++ trunk/src/java/org/tigris/scarab/om/NotificationStatus.java 2006-08-07 15:43:30-0700
@@ -52,6 +52,7 @@
import org.apache.torque.TorqueException;
import org.apache.torque.om.Persistent;
import org.apache.torque.util.Criteria;
+import org.tigris.scarab.notification.ActivityType;
import org.tigris.scarab.tools.ScarabLocalizationTool;
import org.tigris.scarab.tools.localization.L10NKeySet;
import org.tigris.scarab.util.ScarabException;
@@ -72,8 +73,10 @@
static public final Integer FAIL = new Integer(4);
static public final Integer SENT = new Integer(5);
static public final Integer MARK_DELETED = new Integer(6);
+
+ static private final Integer ARCHIVER_ID = new Integer(-1);
- private String activityType;
+ private ActivityType activityType;
private Long issueId;
public NotificationStatus() throws TorqueException
@@ -99,8 +102,12 @@
att = activity.getActivitySet().getAttachment();
if (att != null)
this.setComment(att.getData());
-
- this.setReceiverId(receiver.getUserId());
+ Integer receiverId = receiver.getUserId();
+ if(receiverId == null)
+ {
+ receiverId = ARCHIVER_ID;
+ }
+ this.setReceiverId(receiverId);
}
catch(TorqueException te)
{
@@ -115,7 +122,7 @@
return this.issueId;
}
- public String getActivityType()
+ public ActivityType getActivityType()
{
return this.activityType;
}
@@ -131,7 +138,8 @@
this.issueId = this.getActivity().getIssue().getIssueId();
this.setCreationDate(this.getActivity().getActivitySet().getCreatedDate());
this.setCreatorId(this.getActivity().getActivitySet().getCreator().getUserId());
- this.activityType = this.getActivity().getActivityType();
+ String activityTypeString = this.getActivity().getActivityType();
+ this.activityType = ActivityType.getActivityType(activityTypeString);
}
catch (TorqueException te)
{
@@ -242,7 +250,7 @@
rdo = user1.compareTo(user2);
if (0 == rdo)
{
- rdo = not1.getActivityType().compareTo(not2.getActivityType());
+ rdo = not1.getActivityType().getCode().compareTo(not2.getActivityType().getCode());
if (0 == rdo)
{
rdo = not1.getCreationDate().compareTo(not2.getCreationDate());
Modified: trunk/src/java/org/tigris/scarab/om/ParentChildAttributeOption.java
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/java/org/tigris/scarab/om/ParentChildAttributeOption.java?view=diff&rev=10257&p1=trunk/src/java/org/tigris/scarab/om/ParentChildAttributeOption.java&p2=trunk/src/java/org/tigris/scarab/om/ParentChildAttributeOption.java&r1=10256&r2=10257
==============================================================================
--- trunk/src/java/org/tigris/scarab/om/ParentChildAttributeOption.java (original)
+++ trunk/src/java/org/tigris/scarab/om/ParentChildAttributeOption.java 2006-08-07 15:43:30-0700
@@ -49,14 +49,12 @@
import java.util.ArrayList;
import java.util.List;
-import org.apache.fulcrum.TurbineServices;
import org.apache.fulcrum.cache.CachedObject;
import org.apache.fulcrum.cache.GlobalCacheService;
import org.apache.fulcrum.cache.ObjectExpiredException;
import org.apache.fulcrum.intake.Retrievable;
-import org.apache.fulcrum.localization.Localization;
import org.apache.torque.TorqueException;
-import org.apache.turbine.services.yaaficomponent.YaafiComponentService;
+import org.tigris.scarab.services.ServiceManager;
import org.tigris.scarab.tools.localization.L10NKey;
import org.tigris.scarab.tools.localization.L10NKeySet;
import org.tigris.scarab.util.ScarabException;
@@ -391,9 +389,8 @@
protected static final GlobalCacheService getGlobalCacheService()
{
try{
- YaafiComponentService yaafi = (YaafiComponentService) TurbineServices.getInstance().getService(
- YaafiComponentService.SERVICE_NAME);
- return (GlobalCacheService) yaafi.lookup(GlobalCacheService.class.getName());
+ ServiceManager sm = ServiceManager.getInstance();
+ return (GlobalCacheService) sm.lookup(GlobalCacheService.class);
}
catch (Exception e) {
throw new ScarabRuntimeException(L10NKeySet.ExceptionLookupGlobalCache, e);
Modified: trunk/src/java/org/tigris/scarab/om/ROptionOption.java
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/java/org/tigris/scarab/om/ROptionOption.java?view=diff&rev=10257&p1=trunk/src/java/org/tigris/scarab/om/ROptionOption.java&p2=trunk/src/java/org/tigris/scarab/om/ROptionOption.java&r1=10256&r2=10257
==============================================================================
--- trunk/src/java/org/tigris/scarab/om/ROptionOption.java (original)
+++ trunk/src/java/org/tigris/scarab/om/ROptionOption.java 2006-08-07 15:43:30-0700
@@ -47,14 +47,13 @@
*/
// Turbine classes
-import org.apache.fulcrum.TurbineServices;
import org.apache.fulcrum.cache.CachedObject;
import org.apache.fulcrum.cache.GlobalCacheService;
import org.apache.fulcrum.cache.ObjectExpiredException;
import org.apache.torque.TorqueException;
import org.apache.torque.om.Persistent;
import org.apache.torque.util.Criteria;
-import org.apache.turbine.services.yaaficomponent.YaafiComponentService;
+import org.tigris.scarab.services.ServiceManager;
import org.tigris.scarab.tools.localization.L10NKeySet;
import org.tigris.scarab.util.ScarabException;
import org.tigris.scarab.util.ScarabRuntimeException;
@@ -245,9 +244,8 @@
protected static final GlobalCacheService getGlobalCacheService()
{
try{
- YaafiComponentService yaafi = (YaafiComponentService) TurbineServices.getInstance().getService(
- YaafiComponentService.SERVICE_NAME);
- return (GlobalCacheService) yaafi.lookup(GlobalCacheService.class.getName());
+ ServiceManager sm = ServiceManager.getInstance();
+ return (GlobalCacheService) sm.lookup(GlobalCacheService.class);
}
catch (Exception e) {
throw new ScarabRuntimeException(L10NKeySet.ExceptionLookupGlobalCache, e);
Modified: trunk/src/java/org/tigris/scarab/om/ScarabModule.java
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/java/org/tigris/scarab/om/ScarabModule.java?view=diff&rev=10257&p1=trunk/src/java/org/tigris/scarab/om/ScarabModule.java&p2=trunk/src/java/org/tigris/scarab/om/ScarabModule.java&r1=10256&r2=10257
==============================================================================
--- trunk/src/java/org/tigris/scarab/om/ScarabModule.java (original)
+++ trunk/src/java/org/tigris/scarab/om/ScarabModule.java 2006-08-07 15:43:30-0700
@@ -1054,6 +1054,35 @@
}
/**
+ * Returns the comment rendering engine currently in use.
+ * @return
+ */
+ public String getCommentRenderingEngine()
+ {
+ // TODO: We should return a RenderEngine here and hide
+ // all rendering details in the returned instance.
+ // currently we provide radeoz and plaintext only.
+ // this may change soon ;-) [HD]
+ //
+ String key = GlobalParameter.COMMENT_RENDER_ENGINE;
+ String result = null;
+ try
+ {
+ result = GlobalParameterManager.getString(key, this);
+ }
+ catch (Exception e)
+ {
+ getLog().error("getCommentRenderingEngine(): " + e);
+ }
+
+ if(result == null || result.equals(""))
+ {
+ result = ScarabConstants.COMMENT_RENDER_ENGINE;
+ }
+ return result;
+ }
+
+ /**
* Gets all module roles.
*/
public List getRoles()
Modified: trunk/src/java/org/tigris/scarab/om/ScarabUser.java
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/java/org/tigris/scarab/om/ScarabUser.java?view=diff&rev=10257&p1=trunk/src/java/org/tigris/scarab/om/ScarabUser.java&p2=trunk/src/java/org/tigris/scarab/om/ScarabUser.java&r1=10256&r2=10257
==============================================================================
--- trunk/src/java/org/tigris/scarab/om/ScarabUser.java (original)
+++ trunk/src/java/org/tigris/scarab/om/ScarabUser.java 2006-08-07 15:43:30-0700
@@ -375,6 +375,12 @@
public List getUnusedRModuleIssueTypes(Module module)
throws TorqueException;
+ /**
+ * returns a list of RModuleIssueTypes for the given module.
+ */
+ public List getAllRModuleIssueTypes(Module module)
+ throws TorqueException;
+
void addRMITsToCurrentMITList(List rmits)
throws TorqueException;
Modified: trunk/src/java/org/tigris/scarab/om/ScarabUserImpl.java
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/java/org/tigris/scarab/om/ScarabUserImpl.java?view=diff&rev=10257&p1=trunk/src/java/org/tigris/scarab/om/ScarabUserImpl.java&p2=trunk/src/java/org/tigris/scarab/om/ScarabUserImpl.java&r1=10256&r2=10257
==============================================================================
--- trunk/src/java/org/tigris/scarab/om/ScarabUserImpl.java (original)
+++ trunk/src/java/org/tigris/scarab/om/ScarabUserImpl.java 2006-08-07 15:43:30-0700
@@ -796,7 +796,7 @@
final Integer userid = getUserId();
if (userid == null)
{
- throw new ScarabException (L10NKeySet.ExceptionGeneral,"Userid cannot be null"); //EXCEPTION
+ return false; // throw new ScarabException (L10NKeySet.ExceptionGeneral,"Userid cannot be null"); //EXCEPTION
}
final Criteria crit = new Criteria();
crit.add(UserPreferencePeer.USER_ID, userid);
@@ -816,7 +816,8 @@
{
boolean brdo = false;
String anonymous = Turbine.getConfiguration().getString("scarab.anonymous.username", null);
- if (anonymous != null && getUserName().equals(anonymous))
+ String username = getUserName();
+ if (anonymous != null && username.equals(anonymous))
{
brdo = true;
}
@@ -932,6 +933,15 @@
}
/**
+ * @see ScarabUser#getAllRModuleIssueTypes(Module).
+ */
+ public List getAllRModuleIssueTypes(Module module)
+ throws TorqueException
+ {
+ return internalUser.getAllRModuleIssueTypes(module);
+ }
+
+ /**
* @see ScarabUser#addRMITsToCurrentMITList(List)
*/
public void addRMITsToCurrentMITList(List rmits)
Modified: trunk/src/java/org/tigris/scarab/pipeline/AnonymousLoginValve.java
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/java/org/tigris/scarab/pipeline/AnonymousLoginValve.java?view=diff&rev=10257&p1=trunk/src/java/org/tigris/scarab/pipeline/AnonymousLoginValve.java&p2=trunk/src/java/org/tigris/scarab/pipeline/AnonymousLoginValve.java&r1=10256&r2=10257
==============================================================================
--- trunk/src/java/org/tigris/scarab/pipeline/AnonymousLoginValve.java (original)
+++ trunk/src/java/org/tigris/scarab/pipeline/AnonymousLoginValve.java 2006-08-07 15:43:30-0700
@@ -22,7 +22,6 @@
public class AnonymousLoginValve extends AbstractValve
{
private final static Set nonAnonymousTargets = new HashSet();
- private String userid = null;
private boolean anonymousAccessAllowed = false;
/**
@@ -34,7 +33,6 @@
anonymousAccessAllowed = AnonymousUserUtil.anonymousAccessAllowed();
if (anonymousAccessAllowed) {
Log.get().info("anonymous Login enabled.");
- userid = AnonymousUserUtil.getAnonymousUserId();
//nonAnonymousTargets.add("Index.vm");
//nonAnonymousTargets.add("Logout.vm");
//nonAnonymousTargets.add(conf.getProperty("template.login"));
Modified: trunk/src/java/org/tigris/scarab/pipeline/DetermineTargetValve.java
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/java/org/tigris/scarab/pipeline/DetermineTargetValve.java?view=diff&rev=10257&p1=trunk/src/java/org/tigris/scarab/pipeline/DetermineTargetValve.java&p2=trunk/src/java/org/tigris/scarab/pipeline/DetermineTargetValve.java&r1=10256&r2=10257
==============================================================================
--- trunk/src/java/org/tigris/scarab/pipeline/DetermineTargetValve.java (original)
+++ trunk/src/java/org/tigris/scarab/pipeline/DetermineTargetValve.java 2006-08-07 15:43:30-0700
@@ -49,12 +49,18 @@
import java.io.IOException;
import org.apache.fulcrum.parser.ParameterParser;
+import org.apache.torque.TorqueException;
import org.apache.turbine.RunData;
import org.apache.turbine.Turbine;
import org.apache.turbine.TurbineException;
import org.apache.turbine.ValveContext;
+import org.apache.turbine.modules.Module;
import org.apache.turbine.pipeline.AbstractValve;
+import org.tigris.scarab.om.ScarabUser;
+import org.tigris.scarab.tools.ScarabGlobalTool;
+import org.tigris.scarab.tools.ScarabRequestTool;
import org.tigris.scarab.util.Log;
+import org.tigris.scarab.util.ScarabConstants;
/**
* This valve determines the target template.
@@ -89,9 +95,37 @@
{
//data.getResponse().sendError(404);
//return;
- data.setTarget(Turbine.getConfiguration().getString(
- Turbine.TEMPLATE_HOMEPAGE));
- Log.get().debug("Set target using default value");
+ ScarabUser user = (ScarabUser)data.getUserFromSession();
+ if(user!= null && user.getUserId() != null && user.getUserId().longValue() > 0)
+ {
+ ScarabRequestTool scarabR = ((ScarabRequestTool)Module.getTemplateContext(data)
+ .get(ScarabConstants.SCARAB_REQUEST_TOOL));
+ org.tigris.scarab.om.Module module = scarabR.getCurrentModule();
+
+ try
+ {
+ if(module != null)
+ {
+ target = user.getHomePage(module);
+ }
+ else
+ {
+ target = user.getHomePage();
+ }
+ }
+ catch (TorqueException e)
+ {
+ target = null;
+ }
+ }
+ if(target == null)
+ {
+ target = Turbine.getConfiguration().getString(
+ Turbine.TEMPLATE_HOMEPAGE);
+ }
+ data.setTarget(target);
+ Log.get().debug("Set target to ["+target+"]");
+
}
}
Modified: trunk/src/java/org/tigris/scarab/screens/IssueListExport.java
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/java/org/tigris/scarab/screens/IssueListExport.java?view=diff&rev=10257&p1=trunk/src/java/org/tigris/scarab/screens/IssueListExport.java&p2=trunk/src/java/org/tigris/scarab/screens/IssueListExport.java&r1=10256&r2=10257
==============================================================================
--- trunk/src/java/org/tigris/scarab/screens/IssueListExport.java (original)
+++ trunk/src/java/org/tigris/scarab/screens/IssueListExport.java 2006-08-07 15:43:30-0700
@@ -174,7 +174,6 @@
{
printer.println();
QueryResult queryResult = (QueryResult)i.next();
- queryResult.populateInternalAttributes(rmuas, l10n);
writeRow(printer, mitlist, queryResult);
}
// print a newline when we're done to complete the last line;
Modified: trunk/src/java/org/tigris/scarab/screens/ScarabDefault.java
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/java/org/tigris/scarab/screens/ScarabDefault.java?view=diff&rev=10257&p1=trunk/src/java/org/tigris/scarab/screens/ScarabDefault.java&p2=trunk/src/java/org/tigris/scarab/screens/ScarabDefault.java&r1=10256&r2=10257
==============================================================================
--- trunk/src/java/org/tigris/scarab/screens/ScarabDefault.java (original)
+++ trunk/src/java/org/tigris/scarab/screens/ScarabDefault.java 2006-08-07 15:43:30-0700
@@ -48,8 +48,10 @@
// Turbine Stuff
+import org.apache.fulcrum.security.entity.User;
import org.apache.turbine.RunData;
import org.apache.turbine.TemplateContext;
+import org.tigris.scarab.om.ScarabUser;
import org.tigris.scarab.util.AnonymousUserUtil;
/**
@@ -68,7 +70,12 @@
throws Exception
{
super.doBuildTemplate(data, context);
- AnonymousUserUtil.anonymousLogin(data);
+ //ScarabUser user = (ScarabUser)data.getUser();
+ // only login as anonymous if currently no user is logged in
+ //if(user == null || user.getUserId() == null || user.getUserId().longValue()==0)
+ //{
+ // AnonymousUserUtil.anonymousLogin(data);
+ //}
context.put("modulelink", new ModuleSwitchingLink(data));
}
}
Modified: trunk/src/java/org/tigris/scarab/services/cache/ScarabCache.java
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/java/org/tigris/scarab/services/cache/ScarabCache.java?view=diff&rev=10257&p1=trunk/src/java/org/tigris/scarab/services/cache/ScarabCache.java&p2=trunk/src/java/org/tigris/scarab/services/cache/ScarabCache.java&r1=10256&r2=10257
==============================================================================
--- trunk/src/java/org/tigris/scarab/services/cache/ScarabCache.java (original)
+++ trunk/src/java/org/tigris/scarab/services/cache/ScarabCache.java 2006-08-07 15:43:30-0700
@@ -49,8 +49,7 @@
import java.io.Serializable;
import java.util.Map;
-import org.apache.fulcrum.TurbineServices;
-import org.apache.turbine.services.yaaficomponent.YaafiComponentService;
+import org.tigris.scarab.services.ServiceManager;
import org.tigris.scarab.tools.localization.L10NKeySet;
import org.tigris.scarab.util.ScarabRuntimeException;
@@ -126,9 +125,8 @@
public static final ScarabCacheService getService() {
if (scarabCacheService == null) {
try {
- YaafiComponentService yaafi = (YaafiComponentService) TurbineServices.getInstance().getService(
- YaafiComponentService.SERVICE_NAME);
- scarabCacheService = (ScarabCacheService) yaafi.lookup(ScarabCacheService.class.getName());
+ ServiceManager sm = ServiceManager.getInstance();
+ scarabCacheService = (ScarabCacheService) sm.lookup(ScarabCacheService.class);
} catch (Exception e) {
throw new ScarabRuntimeException(
L10NKeySet.ExceptionScarabCacheService, e);
Modified: trunk/src/java/org/tigris/scarab/tools/ScarabGlobalTool.java
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/java/org/tigris/scarab/tools/ScarabGlobalTool.java?view=diff&rev=10257&p1=trunk/src/java/org/tigris/scarab/tools/ScarabGlobalTool.java&p2=trunk/src/java/org/tigris/scarab/tools/ScarabGlobalTool.java&r1=10256&r2=10257
==============================================================================
--- trunk/src/java/org/tigris/scarab/tools/ScarabGlobalTool.java (original)
+++ trunk/src/java/org/tigris/scarab/tools/ScarabGlobalTool.java 2006-08-07 15:43:30-0700
@@ -151,6 +151,8 @@
private static final String BUILD_VERSION =
Turbine.getConfiguration().getString("scarab.build.version", "");
+ private static RenderContext context = new BaseRenderContext();
+ private static RenderEngine engine = new ScarabRenderEngine();
public void init(Object data)
@@ -694,18 +696,26 @@
{
try
{
- // TODO if these are synchronised, or ScarabGlobalTool instances are per request based,
- // these two lines should be moved to member fields and reused each textToHTML call.
- final RenderContext context = new BaseRenderContext();
- final RenderEngine engine = new ScarabRenderEngine();
- // XXX make this configuration option module based, not a turbine system variable.
- final String txt = Turbine.getConfiguration().getBoolean("scarab.wikitext.disabled", false)
- ? perlUtil.substitute(REGEX_URL,
+ String renderEngine = currentModule.getCommentRenderingEngine();
+ String txt;
+ if(renderEngine.equals("radeox"))
+ {
+ txt = engine.render(text, context);
+ }
+ else if(renderEngine.equals("html"))
+ {
+ txt = perlUtil.substitute(REGEX_URL,
+ perlUtil.substitute(REGEX_MAILTO,
+ perlUtil.substitute(REGEX_NEWLINETOBR,
+ ReferenceInsertionFilter.filter(text))));
+ }
+ else // if(renderEngine.equals("plaintext"))
+ {
+ txt = perlUtil.substitute(REGEX_URL,
perlUtil.substitute(REGEX_MAILTO,
- perlUtil.substitute(REGEX_NEWLINETOBR,
- ReferenceInsertionFilter.filter(text))))
- : engine.render(text, context);
+ ReferenceInsertionFilter.filter(text)));
+ }
return new SimpleSkipFiltering(ScarabUtil.linkifyText(txt, link, currentModule));
}
Modified: trunk/src/java/org/tigris/scarab/tools/ScarabRequestTool.java
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/java/org/tigris/scarab/tools/ScarabRequestTool.java?view=diff&rev=10257&p1=trunk/src/java/org/tigris/scarab/tools/ScarabRequestTool.java&p2=trunk/src/java/org/tigris/scarab/tools/ScarabRequestTool.java&r1=10256&r2=10257
==============================================================================
--- trunk/src/java/org/tigris/scarab/tools/ScarabRequestTool.java (original)
+++ trunk/src/java/org/tigris/scarab/tools/ScarabRequestTool.java 2006-08-07 15:43:30-0700
@@ -512,9 +512,20 @@
return user;
}
+ /**
+ * retrieves the user from the current request.
+ * If the current request has no explicit user in it's data section,
+ * retrieve the current user from the current session.
+ * @return
+ */
public ScarabUser getCurrentUser()
{
- return (ScarabUser)data.getUser();
+ ScarabUser result = (ScarabUser)data.getUser();
+ if(user==null)
+ {
+ result = (ScarabUser)data.getUserFromSession();
+ }
+ return result;
}
/**
Modified: trunk/src/java/org/tigris/scarab/tools/localization/L10NKeySet.java
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/java/org/tigris/scarab/tools/localization/L10NKeySet.java?view=diff&rev=10257&p1=trunk/src/java/org/tigris/scarab/tools/localization/L10NKeySet.java&p2=trunk/src/java/org/tigris/scarab/tools/localization/L10NKeySet.java&r1=10256&r2=10257
==============================================================================
--- trunk/src/java/org/tigris/scarab/tools/localization/L10NKeySet.java (original)
+++ trunk/src/java/org/tigris/scarab/tools/localization/L10NKeySet.java 2006-08-07 15:43:30-0700
@@ -166,6 +166,7 @@
public static final LocalizationKey UserChangesSaved = new L10NKey("UserChangesSaved");
public static final LocalizationKey UserDeleted = new L10NKey("UserDeleted");
public static final LocalizationKey YouHaveBeenLoggedOut = new L10NKey("YouHaveBeenLoggedOut");
+ public static final LocalizationKey AutomaticallyLoggedIn = new L10NKey("AutomaticallyLoggedIn");
public static final LocalizationKey ConditionallyRequiredUserAttribute = new L10NKey("ConditionallyRequiredUserAttribute");
// Experts notifications:
Modified: trunk/src/java/org/tigris/scarab/util/AnonymousUserUtil.java
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/java/org/tigris/scarab/util/AnonymousUserUtil.java?view=diff&rev=10257&p1=trunk/src/java/org/tigris/scarab/util/AnonymousUserUtil.java&p2=trunk/src/java/org/tigris/scarab/util/AnonymousUserUtil.java&r1=10256&r2=10257
==============================================================================
--- trunk/src/java/org/tigris/scarab/util/AnonymousUserUtil.java (original)
+++ trunk/src/java/org/tigris/scarab/util/AnonymousUserUtil.java 2006-08-07 15:43:30-0700
@@ -120,23 +120,45 @@
{
try
{
- User user = AnonymousUserUtil.getAnonymousUser();
- data.setUser(user);
- if( null == user || user.getUserName() == null || user.getUserName().equals(""))
+ User user;
+ user = AnonymousUserUtil.getAnonymousUser();
+ userLogin(data, user);
+ }
+ catch (DataBackendException e)
+ {
+ Log.get().error("anonymousLogin: " + e);
+ }
+ catch (UnknownEntityException e)
+ {
+ Log.get().error("anonymousLogin: " + e);
+ }
+ }
+
+ /**
+ * Login a given user into the session updating the rundata.
+ * @param data
+ * @param user
+ */
+ public static void userLogin(RunData data, User user)
+ {
+ data.setUser(user);
+ if( null == user || user.getUserName() == null || user.getUserName().equals(""))
+ {
+ user.setHasLoggedIn(Boolean.FALSE);
+ }
+ else
+ {
+ user.setHasLoggedIn(Boolean.TRUE);
+ try
{
- user.setHasLoggedIn(Boolean.FALSE);
+ user.updateLastLogin();
}
- else
+ catch (Exception e)
{
- user.setHasLoggedIn(Boolean.TRUE);
- user.updateLastLogin();
+ Log.get().error("userLogin: Error updating last login: " + e);
}
- data.save();
- }
- catch (Exception e)
- {
- Log.get().error("anonymousLogin failed to login anonymously: " + e.getMessage());
}
+ data.save();
}
Modified: trunk/src/java/org/tigris/scarab/util/ComponentLocator.java
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/java/org/tigris/scarab/util/ComponentLocator.java?view=diff&rev=10257&p1=trunk/src/java/org/tigris/scarab/util/ComponentLocator.java&p2=trunk/src/java/org/tigris/scarab/util/ComponentLocator.java&r1=10256&r2=10257
==============================================================================
--- trunk/src/java/org/tigris/scarab/util/ComponentLocator.java (original)
+++ trunk/src/java/org/tigris/scarab/util/ComponentLocator.java 2006-08-07 15:43:30-0700
@@ -6,9 +6,8 @@
*/
package org.tigris.scarab.util;
-import org.apache.fulcrum.TurbineServices;
import org.apache.fulcrum.mimetype.MimeTypeService;
-import org.apache.turbine.services.yaaficomponent.YaafiComponentService;
+import org.tigris.scarab.services.ServiceManager;
import org.tigris.scarab.tools.localization.L10NKeySet;
/**
@@ -42,12 +41,14 @@
* @param class1
* @return
*/
- private static Object lookup(Class clazz) {
- YaafiComponentService yaafi = (YaafiComponentService) TurbineServices
- .getInstance().getService(YaafiComponentService.SERVICE_NAME);
- try {
- return yaafi.lookup(clazz.getName());
- } catch (Exception e) {
+ private static Object lookup(Class clazz)
+ {
+ try
+ {
+ ServiceManager sm = ServiceManager.getInstance();
+ return sm.lookup(clazz);
+ } catch (Exception e)
+ {
throw new ScarabRuntimeException(
L10NKeySet.ExceptionComponentLocator,
clazz.getName(),
Modified: trunk/src/java/org/tigris/scarab/util/Email.java
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/java/org/tigris/scarab/util/Email.java?view=diff&rev=10257&p1=trunk/src/java/org/tigris/scarab/util/Email.java&p2=trunk/src/java/org/tigris/scarab/util/Email.java&r1=10256&r2=10257
==============================================================================
--- trunk/src/java/org/tigris/scarab/util/Email.java (original)
+++ trunk/src/java/org/tigris/scarab/util/Email.java 2006-08-07 15:43:30-0700
@@ -136,16 +136,9 @@
//
// Remove duplicate addresses from the cc: list
//
- ccUsers.removeAll(toUsers);
+ ccUsers.removeAll(toUsers);
- String archiveEmail = module.getArchiveEmail();
- if (archiveEmail != null && archiveEmail.trim().length() == 0)
- {
- archiveEmail = null;
- }
-
- Map userLocaleMap = groupAddressesByLocale(module, toUsers, ccUsers,
- archiveEmail);
+ Map userLocaleMap = groupAddressesByLocale(module, toUsers, ccUsers);
for (Iterator i = userLocaleMap.keySet().iterator(); i.hasNext();)
{
@@ -227,15 +220,6 @@
throw new ScarabException(L10NKeySet.ExceptionEmailFailure,t);
}
}
-
- private static List expandMultipleAddresses(String addresses)
- {
- List expanded = new ArrayList();
- StringTokenizer st = new StringTokenizer(addresses, ",;");
- while (st.hasMoreTokens())
- expanded.add(st.nextToken().trim());
- return expanded;
- }
/**
* Creates a map of Locale objects -> List[2], where the first
@@ -249,8 +233,7 @@
*/
private static Map groupAddressesByLocale(Module module,
Collection toUsers,
- Collection ccUsers,
- String archiveEmail)
+ Collection ccUsers)
throws Exception
{
Map result = new HashMap();
@@ -263,13 +246,6 @@
{
fileUser(result, (ScarabUser) iter.next(), module, CC);
}
- if (archiveEmail != null)
- {
- List expandedArchive = expandMultipleAddresses(archiveEmail);
- for (Iterator iter = expandedArchive.iterator(); iter.hasNext(); )
- fileAddress(result, new InternetAddress((String)iter.next()),
- chooseLocale(null, module), CC);
- }
return result;
}
Modified: trunk/src/java/org/tigris/scarab/util/ScarabConstants.java
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/java/org/tigris/scarab/util/ScarabConstants.java?view=diff&rev=10257&p1=trunk/src/java/org/tigris/scarab/util/ScarabConstants.java&p2=trunk/src/java/org/tigris/scarab/util/ScarabConstants.java&r1=10256&r2=10257
==============================================================================
--- trunk/src/java/org/tigris/scarab/util/ScarabConstants.java (original)
+++ trunk/src/java/org/tigris/scarab/util/ScarabConstants.java 2006-08-07 15:43:30-0700
@@ -307,6 +307,11 @@
final int REPORT_MAX_CRITERIA =
Turbine.getConfiguration().getInt("scarab.report.max.criteria", 5);
+ /**
+ * The default comment rendering engine
+ */
+ final String COMMENT_RENDER_ENGINE =
+ Turbine.getConfiguration().getString("scarab.issue.comment.renderer", "plaintext");
// Http parameters
public static final String HTTP_DOMAIN = "scarab.http.domain";
Modified: trunk/src/java/org/tigris/scarab/util/ScarabException.java
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/java/org/tigris/scarab/util/ScarabException.java?view=diff&rev=10257&p1=trunk/src/java/org/tigris/scarab/util/ScarabException.java&p2=trunk/src/java/org/tigris/scarab/util/ScarabException.java&r1=10256&r2=10257
==============================================================================
--- trunk/src/java/org/tigris/scarab/util/ScarabException.java (original)
+++ trunk/src/java/org/tigris/scarab/util/ScarabException.java 2006-08-07 15:43:30-0700
@@ -262,7 +262,7 @@
{
return (l10nMessage==null)
? super.getMessage()
- : l10nMessage.toString();
+ : l10nMessage.getMessage();
}
/**
@@ -285,7 +285,7 @@
return (l10nMessage==null)
? super.getMessage()
: (localizer == null)
- ? l10nMessage.toString()
+ ? l10nMessage.getMessage()
: l10nMessage.getMessage(localizer);
}
}
Modified: trunk/src/java/org/tigris/scarab/util/ScarabUtil.java
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/java/org/tigris/scarab/util/ScarabUtil.java?view=diff&rev=10257&p1=trunk/src/java/org/tigris/scarab/util/ScarabUtil.java&p2=trunk/src/java/org/tigris/scarab/util/ScarabUtil.java&r1=10256&r2=10257
==============================================================================
--- trunk/src/java/org/tigris/scarab/util/ScarabUtil.java (original)
+++ trunk/src/java/org/tigris/scarab/util/ScarabUtil.java 2006-08-07 15:43:30-0700
@@ -118,7 +118,11 @@
//output = perlUtil.substitute(REGEX_URL,output);
List result = IssueIdParser.tokenizeText(module, output);
- //sb.append("<pre>");
+ String engine = module.getCommentRenderingEngine();
+ if(engine.equals("plaintext"))
+ {
+ sb.append("<pre>");
+ }
for (Iterator itr = result.iterator(); itr.hasNext();)
{
Object tmp = itr.next();
@@ -135,7 +139,10 @@
sb.append(bar);
}
}
- //sb.append("</pre>");
+ if(engine.equals("plaintext"))
+ {
+ sb.append("</pre>");
+ }
return sb.toString();
}
Modified: trunk/src/java/org/tigris/scarab/util/word/IssueSearch.java
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/java/org/tigris/scarab/util/word/IssueSearch.java?view=diff&rev=10257&p1=trunk/src/java/org/tigris/scarab/util/word/IssueSearch.java&p2=trunk/src/java/org/tigris/scarab/util/word/IssueSearch.java&r1=10256&r2=10257
==============================================================================
--- trunk/src/java/org/tigris/scarab/util/word/IssueSearch.java (original)
+++ trunk/src/java/org/tigris/scarab/util/word/IssueSearch.java 2006-08-07 15:43:30-0700
@@ -2327,6 +2327,41 @@
return sortColumn;
}
+ private String setupInternalSortColumn(String sortInternal, StringBuffer sortOuterJoin, Set tableAliases)
+ throws TorqueException
+ {
+ String sortColumn = null;
+ String joinColumn = null;
+ String alias = ACTIVITYSETALIAS + "_sort";
+ if (sortInternal.equals(RModuleUserAttribute.MODIFIED_BY.getName()))
+ {
+ sortColumn = ACTSET_CREATED_BY;
+ joinColumn = IssuePeer.LAST_TRANS_ID;
+ }
+ else if (sortInternal.equals(RModuleUserAttribute.MODIFIED_DATE.getName()))
+ {
+ sortColumn = ACTSET_CREATED_DATE;
+ joinColumn = IssuePeer.LAST_TRANS_ID;
+ }
+ else if (sortInternal.equals(RModuleUserAttribute.CREATED_BY.getName()))
+ {
+ sortColumn = ACTSET_CREATED_BY;
+ joinColumn = IssuePeer.CREATED_TRANS_ID;
+ }
+ else if (sortInternal.equals(RModuleUserAttribute.CREATED_DATE.getName()))
+ {
+ sortColumn = ACTSET_CREATED_DATE;
+ joinColumn = IssuePeer.CREATED_TRANS_ID;
+ }
+ sortOuterJoin.append(LEFT_OUTER_JOIN)
+ .append(ActivitySetPeer.TABLE_NAME).append(' ')
+ .append(alias).append(ON)
+ .append(alias).append(".TRANSACTION_ID ")
+ .append('=').append(joinColumn).append(')');
+
+ return alias + "." + sortColumn;
+ }
+
private List getSearchSqlPieces(StringBuffer from, StringBuffer where,
Set tableAliases)
throws TorqueException
@@ -2356,15 +2391,10 @@
}
else if (sortInternal != null)
{
- // WARNING: alias != column name
- if (sortInternal.equals(RModuleUserAttribute.MODIFIED_BY.getName()))
- sortColumn = ACTIVITYSETALIAS_MODIFICATION + ".CREATED_BY";
- else if (sortInternal.equals(RModuleUserAttribute.MODIFIED_DATE.getName()))
- sortColumn = ACTIVITYSETALIAS_MODIFICATION + ".CREATED_DATE";
- else if (sortInternal.equals(RModuleUserAttribute.CREATED_BY.getName()))
- sortColumn = ACTIVITYSETALIAS_MODIFICATION + ".CREATED_BY";
- else if (sortInternal.equals(RModuleUserAttribute.CREATED_DATE.getName()))
- sortColumn = ACTIVITYSETALIAS + "." + ACTSET_CREATED_DATE;
+ sortOuterJoin = new StringBuffer(128);
+ sortColumn = setupInternalSortColumn(sortInternal, sortOuterJoin,
+ tableAliases);
+ sql.append(',').append(sortColumn);
}
sql.append(FROM).append(IssuePeer.TABLE_NAME);
@@ -2451,10 +2481,13 @@
cb.size = count;
if (sortAttrId != null)
{
- cb.sortColumn = setupSortColumn(sortAttrId, outerJoin,
- tableAliases);
- partialSql.append(',').append(
- cb.sortColumn);
+ cb.sortColumn = setupSortColumn(sortAttrId, outerJoin, tableAliases);
+ partialSql.append(',').append(cb.sortColumn);
+ }
+ else if (sortInternal != null)
+ {
+ cb.sortColumn = setupInternalSortColumn(sortInternal, outerJoin, tableAliases);
+ partialSql.append(',').append(cb.sortColumn);
}
cb.select = partialSql;
cb.outerJoins = outerJoin;
@@ -3013,6 +3046,7 @@
}
index += size;
}
+ qr.populateInternalAttributes(issueListAttributeColumns, L10N);
}
private void queryResultStarted(ResultSet rs, QueryResult qr,
Modified: trunk/src/java/org/tigris/scarab/util/word/LuceneSearchIndex.java
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/java/org/tigris/scarab/util/word/LuceneSearchIndex.java?view=diff&rev=10257&p1=trunk/src/java/org/tigris/scarab/util/word/LuceneSearchIndex.java&p2=trunk/src/java/org/tigris/scarab/util/word/LuceneSearchIndex.java&r1=10256&r2=10257
==============================================================================
--- trunk/src/java/org/tigris/scarab/util/word/LuceneSearchIndex.java (original)
+++ trunk/src/java/org/tigris/scarab/util/word/LuceneSearchIndex.java 2006-08-07 15:43:30-0700
@@ -527,7 +527,7 @@
public void updateIndex()
throws Exception
{
- // find estimate of max id
+ Log.get().info("find estimate of max id...");
Criteria crit = new Criteria();
crit.addSelectColumn("max(" + AttributeValuePeer.VALUE_ID + ")");
List records = AttributeValuePeer.doSelectVillageRecords(crit);
@@ -535,6 +535,8 @@
long i = 0L;
List avs = null;
+
+ Log.get().info("index attribute values in database ...");
do
{
crit = new Criteria();
@@ -569,7 +571,7 @@
}
while (i<max || !avs.isEmpty());
- // Attachments
+ Log.get().info("Index attachments ...");// Attachments
crit = new Criteria();
crit.addSelectColumn("max(" + AttachmentPeer.ATTACHMENT_ID + ")");
@@ -616,7 +618,7 @@
}
while (i<max || !atts.isEmpty());
- // finish off with an optimized index
+ Log.get().info("Finish off with an optimized index...");
synchronized (getClass())
{
IndexWriter indexer = null;
@@ -633,7 +635,8 @@
indexer.close();
}
}
- }
+ }
+ Log.get().info("Indexing terminated.");
}
// ---------------- Avalon Lifecycle Methods ---------------------
Modified: trunk/src/java/org/tigris/scarab/util/word/SearchFactory.java
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/java/org/tigris/scarab/util/word/SearchFactory.java?view=diff&rev=10257&p1=trunk/src/java/org/tigris/scarab/util/word/SearchFactory.java&p2=trunk/src/java/org/tigris/scarab/util/word/SearchFactory.java&r1=10256&r2=10257
==============================================================================
--- trunk/src/java/org/tigris/scarab/util/word/SearchFactory.java (original)
+++ trunk/src/java/org/tigris/scarab/util/word/SearchFactory.java 2006-08-07 15:43:30-0700
@@ -46,9 +46,11 @@
* individuals on behalf of Collab.Net.
*/
-import org.apache.fulcrum.TurbineServices;
+import org.apache.fulcrum.cache.GlobalCacheService;
import org.apache.turbine.services.yaaficomponent.YaafiComponentService;
-import org.tigris.scarab.util.Log;
+import org.tigris.scarab.services.ServiceManager;
+import org.tigris.scarab.tools.localization.L10NKeySet;
+import org.tigris.scarab.util.ScarabRuntimeException;
/**
* Returns an instance of the SearchIndex specified in Scarab.properties
@@ -65,17 +67,13 @@
if (result == null)
{
- try {
- YaafiComponentService yaafi = (YaafiComponentService) TurbineServices.getInstance().getService(
- YaafiComponentService.SERVICE_NAME);
- result = (SearchIndex) yaafi.lookup(SearchIndex.class.getName());
- } catch (Exception e) {
- String str = "Could not create new instance of SearchIndex. "
- + "Could be a result of insufficient permission "
- + "to write the Index to the disk. The default is to "
- + "write the Index into the WEB-INF/index directory.";
- Log.get().error(str, e);
- throw new InstantiationException(str); //EXCEPTION
+
+ try{
+ ServiceManager sm = ServiceManager.getInstance();
+ return (SearchIndex) sm.lookup(SearchIndex.class);
+ }
+ catch (Exception e) {
+ throw new ScarabRuntimeException(L10NKeySet.ExceptionLucene, e);
}
}
return result;
@@ -87,8 +85,7 @@
*/
public static void releaseInstance(SearchIndex searchIndex)
{
- YaafiComponentService yaafi = (YaafiComponentService) TurbineServices.getInstance().getService(
- YaafiComponentService.SERVICE_NAME);
+ YaafiComponentService yaafi = ServiceManager.getService();
searchIndex.clear();
yaafi.release(searchIndex);
}
Modified: trunk/src/java/org/tigris/scarab/util/xmlissues/ScarabIssues.java
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/java/org/tigris/scarab/util/xmlissues/ScarabIssues.java?view=diff&rev=10257&p1=trunk/src/java/org/tigris/scarab/util/xmlissues/ScarabIssues.java&p2=trunk/src/java/org/tigris/scarab/util/xmlissues/ScarabIssues.java&r1=10256&r2=10257
==============================================================================
--- trunk/src/java/org/tigris/scarab/util/xmlissues/ScarabIssues.java (original)
+++ trunk/src/java/org/tigris/scarab/util/xmlissues/ScarabIssues.java 2006-08-07 15:43:30-0700
@@ -862,7 +862,7 @@
}
}
- private Issue createNewIssue(final XmlModule module, final XmlIssue issue)
+ private Issue createNewIssue(final XmlModule module, final XmlIssue issue, final String id)
throws TorqueException,ScarabException
{
// get the instance of the module
@@ -872,6 +872,13 @@
issueTypeOM.setName(issue.getArtifactType());
// get me a new issue since we couldn't find one before
final Issue issueOM = Issue.getNewInstance(moduleOM, issueTypeOM);
+
+ // The import data may nominate its ID
+ if (id != null) {
+ // This will cause Issue.save() to use this ID
+ issueOM.setIdCount(Integer.parseInt(id));
+ }
+
// create the issue in the database
issueOM.save();
@@ -900,19 +907,29 @@
/////////////////////////////////////////////////////////////////////////////////
// Get me an issue
Issue issueOM = null;
+ final String issueID = issue.hasModuleCode() ? "" : module.getCode() + issue.getId();
if (getImportTypeCode() == CREATE_SAME_DB || getImportTypeCode() == CREATE_DIFFERENT_DB)
{
- issueOM = createNewIssue(module, issue);
+ // Check if the new issue nominates an ID and if the database does
+ // not already contain an issue with that ID
+ if (issue.getId() != null && IssueManager.getIssueById(issueID) == null)
+ {
+ // Create the new issue with the nominated ID
+ issueOM = createNewIssue(module, issue, issue.getId());
+ }
+ else
+ {
+ // Crate the new issue with an automatically allocated ID
+ issueOM = createNewIssue(module, issue, null);
+ }
}
else if (getImportTypeCode() == UPDATE_SAME_DB) // nice to specify just for searching/refactoring
{
- issueOM = IssueManager.getIssueById(
- (issue.hasModuleCode()?"":module.getCode())
- + issue.getId());
+ issueOM = IssueManager.getIssueById(issueID);
if (issueOM == null)
{
- issueOM = createNewIssue(module, issue);
+ issueOM = createNewIssue(module, issue, null);
}
else
{
@@ -1360,7 +1377,7 @@
private boolean isDuplicateDependency(final XmlActivitySet activitySet)
{
- return (dependActivitySetId.indexOf(activitySet.getId())<0);
+ return (dependActivitySetId.indexOf(activitySet.getId()) > -1);
}
private Activity createActivity(final XmlActivity activity,
Modified: trunk/src/schema/scarab-schema.xml
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/schema/scarab-schema.xml?view=diff&rev=10257&p1=trunk/src/schema/scarab-schema.xml&p2=trunk/src/schema/scarab-schema.xml&r1=10256&r2=10257
==============================================================================
--- trunk/src/schema/scarab-schema.xml (original)
+++ trunk/src/schema/scarab-schema.xml 2006-08-07 15:43:30-0700
@@ -1942,7 +1942,7 @@
<!-- =============================================================== -->
<!-- optional comment (mainly used for error messages) -->
<!-- =============================================================== -->
- <column name="COMMENT" required="false" type="VARCHAR" size="255"/>
+ <column name="STATUS_COMMENT" javaName="Comment" required="false" type="VARCHAR" size="255"/>
<foreign-key foreignTable="TURBINE_USER">
Modified: trunk/src/sql/mysql/upgrade/mysql-upgrade-1.0b20-1.0b21-1.sql
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/sql/mysql/upgrade/mysql-upgrade-1.0b20-1.0b21-1.sql?view=diff&rev=10257&p1=trunk/src/sql/mysql/upgrade/mysql-upgrade-1.0b20-1.0b21-1.sql&p2=trunk/src/sql/mysql/upgrade/mysql-upgrade-1.0b20-1.0b21-1.sql&r1=10256&r2=10257
==============================================================================
--- trunk/src/sql/mysql/upgrade/mysql-upgrade-1.0b20-1.0b21-1.sql (original)
+++ trunk/src/sql/mysql/upgrade/mysql-upgrade-1.0b20-1.0b21-1.sql 2006-08-07 15:43:30-0700
@@ -32,3 +32,14 @@
INSERT INTO TURBINE_PERMISSION (PERMISSION_ID, PERMISSION_NAME) VALUES (21, 'Issue | Comment');
INSERT INTO TURBINE_PERMISSION (PERMISSION_ID, PERMISSION_NAME) VALUES (20, 'Issue | Delete');
+
+--
+-- Grant the new 'comment' (21) permission to anyone previously having 'edit' (1)
+-- permission
+--
+CREATE TABLE SCARAB_B20_B21_PERMS
+SELECT ROLE_ID, 21 AS PERMISSION_ID FROM TURBINE_ROLE_PERMISSION WHERE PERMISSION_ID = 1;
+
+INSERT INTO TURBINE_ROLE_PERMISSION SELECT ROLE_ID, PERMISSION_ID FROM SCARAB_B20_B21_PERMS;
+
+DROP TABLE SCARAB_B20_B21_PERMS;
Modified: trunk/src/sql/mysql/upgrade/mysql-upgrade-1.0b20-1.0b21-2.sql
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/sql/mysql/upgrade/mysql-upgrade-1.0b20-1.0b21-2.sql?view=diff&rev=10257&p1=trunk/src/sql/mysql/upgrade/mysql-upgrade-1.0b20-1.0b21-2.sql&p2=trunk/src/sql/mysql/upgrade/mysql-upgrade-1.0b20-1.0b21-2.sql&r1=10256&r2=10257
==============================================================================
--- trunk/src/sql/mysql/upgrade/mysql-upgrade-1.0b20-1.0b21-2.sql (original)
+++ trunk/src/sql/mysql/upgrade/mysql-upgrade-1.0b20-1.0b21-2.sql 2006-08-07 15:43:30-0700
@@ -18,13 +18,13 @@
STATUS MEDIUMINT NOT NULL,
CREATION_DATE DATETIME,
CHANGE_DATE DATETIME,
- COMMENT VARCHAR(255),
+ STATUS_COMMENT VARCHAR(255),
PRIMARY KEY(ACTIVITY_ID,CREATOR_ID,RECEIVER_ID),
FOREIGN KEY (CREATOR_ID) REFERENCES TURBINE_USER (USER_ID),
FOREIGN KEY (RECEIVER_ID) REFERENCES TURBINE_USER (USER_ID),
FOREIGN KEY (ACTIVITY_ID) REFERENCES SCARAB_ACTIVITY (ACTIVITY_ID),
INDEX IX_NOTIF_STATUS (STATUS)
-);
+)ENGINE=MyISAM;
--
-- SCARAB_NOTIFICATION_FILTER
@@ -42,7 +42,7 @@
PRIMARY KEY(MODULE_ID,USER_ID,ACTIVITY_TYPE,MANAGER_ID),
FOREIGN KEY (USER_ID) REFERENCES TURBINE_USER (USER_ID),
FOREIGN KEY (MODULE_ID) REFERENCES SCARAB_MODULE (MODULE_ID)
-);
+)ENGINE=MyISAM;
--
-- SCARAB_DEFAULT_NOTIFICATION_FILTER
@@ -56,6 +56,6 @@
FILTER_STATE int(1) NOT NULL default '0',
MODIFYABlE int(1) NOT NULL default '1',
PRIMARY KEY (MODULE_ID,ROLE_ID,ACTIVITY_TYPE,MANAGER_ID)
-);
+)ENGINE=MyISAM;
SET FOREIGN_KEY_CHECKS = 1;
Modified: trunk/src/sql/mysql/upgrade/mysql-upgrade-1.0b20-1.0b21-3.sql
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/sql/mysql/upgrade/mysql-upgrade-1.0b20-1.0b21-3.sql?view=diff&rev=10257&p1=trunk/src/sql/mysql/upgrade/mysql-upgrade-1.0b20-1.0b21-3.sql&p2=trunk/src/sql/mysql/upgrade/mysql-upgrade-1.0b20-1.0b21-3.sql&r1=10256&r2=10257
==============================================================================
--- trunk/src/sql/mysql/upgrade/mysql-upgrade-1.0b20-1.0b21-3.sql (original)
+++ trunk/src/sql/mysql/upgrade/mysql-upgrade-1.0b20-1.0b21-3.sql 2006-08-07 15:43:30-0700
@@ -33,8 +33,6 @@
DROP TABLE SCARAB_ISSUE;
-SET FOREIGN_KEY_CHECKS = 0;
-
CREATE TABLE SCARAB_ISSUE
(
PRIMARY KEY(ISSUE_ID),
@@ -44,7 +42,7 @@
(TRANSACTION_ID),
INDEX IX_TYPE_MODULE (TYPE_ID, MODULE_ID),
INDEX IX_COUNT_PREFIX (ID_COUNT, ID_PREFIX)
-)
+)ENGINE=MyISAM
SELECT i.ISSUE_ID, i.ID_PREFIX, i.ID_COUNT, i.ID_DOMAIN, i.TYPE_ID,
i.MODULE_ID, i.CREATED_TRANS_ID,
max(a.transaction_id) LAST_TRANS_ID,
@@ -52,5 +50,3 @@
FROM SCARAB_ISSUE_BACKUP_b20_b21 i LEFT OUTER JOIN SCARAB_ACTIVITY a ON
(i.ISSUE_ID = a.ISSUE_ID)
GROUP BY i.ISSUE_ID;
-
-SET FOREIGN_KEY_CHECKS = 1;
Modified: trunk/src/sql/oracle/upgrade/oracle-upgrade-1.0b20-1.0b21-2.sql
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/sql/oracle/upgrade/oracle-upgrade-1.0b20-1.0b21-2.sql?view=diff&rev=10257&p1=trunk/src/sql/oracle/upgrade/oracle-upgrade-1.0b20-1.0b21-2.sql&p2=trunk/src/sql/oracle/upgrade/oracle-upgrade-1.0b20-1.0b21-2.sql&r1=10256&r2=10257
==============================================================================
--- trunk/src/sql/oracle/upgrade/oracle-upgrade-1.0b20-1.0b21-2.sql (original)
+++ trunk/src/sql/oracle/upgrade/oracle-upgrade-1.0b20-1.0b21-2.sql 2006-08-07 15:43:30-0700
@@ -9,7 +9,7 @@
STATUS MEDIUMINT NOT NULL,
CREATION_DATE DATETIME,
CHANGE_DATE DATETIME,
- COMMENT VARCHAR2(255),
+ STATUS_COMMENT VARCHAR2(255),
PRIMARY KEY(ACTIVITY_ID,CREATOR_ID,RECEIVER_ID),
FOREIGN KEY (CREATOR_ID) REFERENCES TURBINE_USER (USER_ID),
FOREIGN KEY (RECEIVER_ID) REFERENCES TURBINE_USER (USER_ID),
Modified: trunk/src/sql/postgresql/upgrade/postgresql-upgrade-1.0b20-1.0b21-1.sql
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/sql/postgresql/upgrade/postgresql-upgrade-1.0b20-1.0b21-1.sql?view=diff&rev=10257&p1=trunk/src/sql/postgresql/upgrade/postgresql-upgrade-1.0b20-1.0b21-1.sql&p2=trunk/src/sql/postgresql/upgrade/postgresql-upgrade-1.0b20-1.0b21-1.sql&r1=10256&r2=10257
==============================================================================
--- trunk/src/sql/postgresql/upgrade/postgresql-upgrade-1.0b20-1.0b21-1.sql (original)
+++ trunk/src/sql/postgresql/upgrade/postgresql-upgrade-1.0b20-1.0b21-1.sql 2006-08-07 15:43:30-0700
@@ -31,3 +31,14 @@
---
INSERT INTO TURBINE_PERMISSION (PERMISSION_ID, PERMISSION_NAME) VALUES (21, 'Issue | Comment');
INSERT INTO TURBINE_PERMISSION (PERMISSION_ID, PERMISSION_NAME) VALUES (20, 'Issue | Delete');
+
+---
+--- Grant the new 'comment' (21) permission to anyone previously having 'edit' (1)
+--- permission
+---
+CREATE TABLE SCARAB_B20_B21_PERMS AS
+SELECT ROLE_ID, 21 AS PERMISSION_ID FROM TURBINE_ROLE_PERMISSION WHERE PERMISSION_ID = 1;
+
+INSERT INTO TURBINE_ROLE_PERMISSION SELECT ROLE_ID, PERMISSION_ID FROM SCARAB_B20_B21_PERMS;
+
+DROP TABLE SCARAB_B20_B21_PERMS;
Modified: trunk/src/sql/postgresql/upgrade/postgresql-upgrade-1.0b20-1.0b21-2.sql
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/sql/postgresql/upgrade/postgresql-upgrade-1.0b20-1.0b21-2.sql?view=diff&rev=10257&p1=trunk/src/sql/postgresql/upgrade/postgresql-upgrade-1.0b20-1.0b21-2.sql&p2=trunk/src/sql/postgresql/upgrade/postgresql-upgrade-1.0b20-1.0b21-2.sql&r1=10256&r2=10257
==============================================================================
--- trunk/src/sql/postgresql/upgrade/postgresql-upgrade-1.0b20-1.0b21-2.sql (original)
+++ trunk/src/sql/postgresql/upgrade/postgresql-upgrade-1.0b20-1.0b21-2.sql 2006-08-07 15:43:30-0700
@@ -15,7 +15,7 @@
STATUS INTEGER NOT NULL,
CREATION_DATE DATE,
CHANGE_DATE DATE,
- COMMENT VARCHAR(255),
+ STATUS_COMMENT VARCHAR(255),
PRIMARY KEY(ACTIVITY_ID,CREATOR_ID,RECEIVER_ID),
FOREIGN KEY (CREATOR_ID) REFERENCES TURBINE_USER (USER_ID),
FOREIGN KEY (RECEIVER_ID) REFERENCES TURBINE_USER (USER_ID),
Modified: trunk/src/webapp/WEB-INF/templates/email/notification/IssueActivity.vm
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/webapp/WEB-INF/templates/email/notification/IssueActivity.vm?view=diff&rev=10257&p1=trunk/src/webapp/WEB-INF/templates/email/notification/IssueActivity.vm&p2=trunk/src/webapp/WEB-INF/templates/email/notification/IssueActivity.vm&r1=10256&r2=10257
==============================================================================
--- trunk/src/webapp/WEB-INF/templates/email/notification/IssueActivity.vm (original)
+++ trunk/src/webapp/WEB-INF/templates/email/notification/IssueActivity.vm 2006-08-07 15:43:30-0700
@@ -17,89 +17,87 @@
#set ($user = $issue.ModifiedBy)
#set ($defaultText = $issue.DefaultText)
#set ($module = $issue.Module)
-===============================================================================
$l10n.ActivityReportOn
- #markup('u')$issue.UniqueId - $issue.DefaultText#markup('u')
+ #markup('b')$issue.IssueType.Name $issue.UniqueId - $issue.DefaultText#markup('b')
+
+
+ $l10n.ScarabLink: $link.getIssueIdLink($issue)
+ $l10n.CapModule: $module.Name
-#markup('i')$l10n.IssueType#markup('i'): $issue.IssueType.Name
-#markup('i')$l10n.CapModule#markup('i'): $module.Name
-#markup('i')$l10n.ScarabLink#markup('i'): $link.getIssueIdLink($issue)
#if ($multipleActivity)
-$l10n.ActivityGeneratedBy
+ $l10n.ActivityGeneratedBy
#foreach ($creat in $creators)
- $creat.Name ($creat.Email)
#end
- $l10n.ActivityBetween $firstNotification.getActivityCreationDate($l10n) $l10n.ActivityAnd $lastNotification.getActivityCreationDate($l10n).
+ $l10n.ActivityBetween $firstNotification.getActivityCreationDate($l10n) $l10n.ActivityAnd $lastNotification.getActivityCreationDate($l10n).
#else
- $l10n.ActivityGeneratedBy #foreach ($creat in $creators) $creat.Name ($creat.Email) #end $l10n.ActivityAt $firstNotification.getActivityCreationDate($l10n)
+ $l10n.ActivityGeneratedBy #foreach ($creat in $creators) $creat.Name ($creat.Email) #end $l10n.ActivityAt $firstNotification.getActivityCreationDate($l10n)
#end
#if ($ActivityReasons.size() > 0)
-#markup('i')$l10n.ActivityReasons#markup('i')
+ #markup('b')$l10n.ActivityReasons#markup('b')
#foreach ($reason in $ActivityReasons)
- * $reason
+ - $reason
#end
#end
-===============================================================================
+
#if ($ActivityIssue)
#foreach ($not in $ActivityIssue)
-** $not.Activity.getDescription($l10n) **
+ ** $not.Activity.getDescription($l10n) **
#end
-------------------------------------------------------------------------------
#end
#if ($ActivityPersonnelChanges)
- #markup('b')$l10n.ActivityPersonnelChanges#markup('b')
+ #markup('b')$l10n.ActivityPersonnelChanges#markup('b')
#foreach ($not in $ActivityPersonnelChanges)
-* $not.Activity.getDescription($l10n)
+ - $not.Activity.getDescription($l10n)
#end
-------------------------------------------------------------------------------
#end
#if ($ActivityAttributeChanges)
- #markup('b')$l10n.ActivityAttributeChanges#markup('b')
+ #markup('b')$l10n.ActivityAttributeChanges#markup('b')
#foreach ($not in $ActivityAttributeChanges)
#if ($not.Activity.Attribute.AttributeType.Name == "long-string")
-* $l10n.format("AttributeSetTo", $not.Activity.DisplayName):
+ - $l10n.format("AttributeSetTo", $not.Activity.DisplayName):
"$not.Activity.NewValue"
#else
-* $not.Activity.getDescription($l10n)
+ - $not.Activity.getDescription($l10n)
#end
#end
-------------------------------------------------------------------------------
#end
#if ($ActivityAssociatedInfo)
- #markup('b')$l10n.ActivityAssociatedInfo#markup('b')
+ #markup('b')$l10n.ActivityAssociatedInfo#markup('b')
#foreach ($not in $ActivityAssociatedInfo)
-* $not.Activity.getDescription($l10n)
+ - $not.Activity.getDescription($l10n)
#end
-------------------------------------------------------------------------------
#end
#if ($ActivityDependencies)
- #markup('b')$l10n.ActivityDependencies#markup('b')
+ #markup('b')$l10n.ActivityDependencies#markup('b')
#foreach ($not in $ActivityDependencies)
-* $not.Activity.getDescription($l10n)
+ - $not.Activity.getDescription($l10n)
#end
-------------------------------------------------------------------------------
#end
#if ($ActivityComments)
- #markup('b')$l10n.ActivityComments#markup('b')
+ #markup('b')$l10n.ActivityComments#markup('b')
#foreach ($not in $ActivityComments)
---- #markup('i')$l10n.By $not.Creator.Name - $not.getActivityCreationDate($l10n)#markup('i') ---
+ - $l10n.By $not.Creator.Name - $not.getActivityCreationDate($l10n) ---
"$not.Activity.Attachment.Data"
#end
#end
-
-===============================================================================
\ No newline at end of file
Modified: trunk/src/webapp/WEB-INF/templates/email/notification/IssueActivitySubject.vm
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/webapp/WEB-INF/templates/email/notification/IssueActivitySubject.vm?view=diff&rev=10257&p1=trunk/src/webapp/WEB-INF/templates/email/notification/IssueActivitySubject.vm&p2=trunk/src/webapp/WEB-INF/templates/email/notification/IssueActivitySubject.vm&r1=10256&r2=10257
==============================================================================
--- trunk/src/webapp/WEB-INF/templates/email/notification/IssueActivitySubject.vm (original)
+++ trunk/src/webapp/WEB-INF/templates/email/notification/IssueActivitySubject.vm 2006-08-07 15:43:30-0700
@@ -1 +1 @@
-#set ($args = [$issue.Module.RealName.toUpperCase(), $issue.UniqueId, $l10n.getIgnoreMissingResource($issue.getEmailShortInfo())]) $l10n.format("DefaultModifyIssueEmailSubject", $args)
\ No newline at end of file
+#set ($args = [$issue.Module.RealName.toUpperCase(), $issue.UniqueId, $l10n.getIgnoreMissingResource($changedStatus)]) $l10n.format("DefaultModifyIssueEmailSubject", $args)
\ No newline at end of file
Modified: trunk/src/webapp/WEB-INF/templates/macros/MITListMacro.vm
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/webapp/WEB-INF/templates/macros/MITListMacro.vm?view=diff&rev=10257&p1=trunk/src/webapp/WEB-INF/templates/macros/MITListMacro.vm&p2=trunk/src/webapp/WEB-INF/templates/macros/MITListMacro.vm&r1=10256&r2=10257
==============================================================================
--- trunk/src/webapp/WEB-INF/templates/macros/MITListMacro.vm (original)
+++ trunk/src/webapp/WEB-INF/templates/macros/MITListMacro.vm 2006-08-07 15:43:30-0700
@@ -30,14 +30,16 @@
##
## Warning: This assumes $scarabR.getSessionAttribute will return something!!!
##
- #set ($mitList = $user.CurrentMITList)
- #set ($editingList = ($mitList && !$mitList.isEmpty()))
+
+#set ($mitList = $user.CurrentMITList)
+#set ($editingList = ($mitList && !$mitList.isEmpty()))
#set ($currentModule = $scarabR.CurrentModule)
#set ($availableAttributes = $currentModule.AllOptionAttributes)
-#set ($currentAttributeName = $scarabR.getSessionAttribute("attribute_id") )
+#set ($sessionAttributeKey = "attribute_id_$currentModule.moduleId" )
+#set ($currentAttributeName = $scarabR.getSessionAttribute($sessionAttributeKey) )
#set ($currentAttributeOptions = $currentModule.getAllAttributeOptions($currentAttributeName))
-#set ($currentRmits = $user.getUnusedRModuleIssueTypes($currentModule))
+#set ($currentRmits = $user.getAllRModuleIssueTypes($currentModule))
#set ($savedLists = $user.MITLists)
#set ($isMoreThanOne = $currentRmits.size() > 1)
#set ($atLeastOneRMIT = $currentRmits && !$currentRmits.isEmpty())
@@ -48,6 +50,9 @@
<div class="colbar">
<p>
#if ($atLeastOneSaved)
+ ## -------------------------------------
+ ##Create list of saved queries ...<br/>
+ ## -------------------------------------
<select name="list_id" onclick="allit.checked=false" >
<option value="">$displayText</option>
#foreach ($list in $savedLists)
@@ -65,8 +70,14 @@
</p>
</div>
+
#if ($atLeastOneRMIT)
<table class="" width="100%" border="1" cellspacing="2" cellpadding="3" >
+
+## --------------------------------------------
+##<tr><td>doMatrix header ...</td></tr>
+## --------------------------------------------
+
<tr>
<th style="text-align:left"></th>
<th nowrap="nowrap" style="text-align:right">
@@ -91,8 +102,13 @@
##<th>$l10n.Description</th>
</tr>
+## --------------------------------------------
+##<tr><td>doMatrix sum ...</td></tr>
+## --------------------------------------------
+
+
<tr>
-<th style="text-align:left; border-bottom-style:solid;border-bottom-width:1px;border-color:#ABC4DB;">total</th>
+<th style="text-align:left; border-bottom-style:solid;border-bottom-width:1px;border-color:#ABC4DB;">$l10n.Total</th>
<th style="text-align:right; border-bottom-style:solid;border-bottom-width:1px;border-color:#ABC4DB;">
#set ($itemCount = $module.getIssueCount($user))
#if ($itemCount == 0)
@@ -114,6 +130,9 @@
</tr>
+## --------------------------------------------
+##<tr><td>doMatrix body ...</td></tr>
+## --------------------------------------------
#set ($checked = !$isMoreThanOne)
#foreach ($attrOption in $currentAttributeOptions)
@@ -143,11 +162,18 @@
</tr>
#end
+## --------------------------------------------
+##<tr><td>end doMatrix body</td></tr>
+## --------------------------------------------
+
</table>
+
#else
$l10n.NoMoreIssueTypes
#end
+
+
#if ($atLeastOneRMIT || $atLeastOneSaved)
<div class="functnbar3">
<input type="submit" name="eventSubmit_do$event" value="$buttonName" />
@@ -191,8 +217,6 @@
</div>
#end
-
-
#if ($showOtherModuleSection)
<h3>
@@ -335,6 +359,112 @@
#end
+#macro (renderQueryMatrix)
+
+ #set ($imgpath = $staticLink.setPath('/images') )
+
+ #set ($currentModule = $scarabR.CurrentModule)
+ #set ($availableAttributes = $currentModule.AllOptionAttributes)
+
+ #set ($currentAttributeId = $data.Parameters.getInteger("attribute_id", 0) )
+ #set ($sessionAttributeKey = "attribute_id_$currentModule.moduleId" )
+ #if ($currentAttributeId == 0)
+ #if ($scarabR.hasSessionAttribute($sessionAttributeKey))
+ #set ($currentAttributeId = $scarabR.getSessionAttribute($sessionAttributeKey) )
+ #else
+ #set ($currentAttributeId = $availableAttributes.get(0).AttributeId )
+ #end
+ #end
+ #set ($dummy = $scarabR.setSessionAttribute($sessionAttributeKey, $currentAttributeId))
+
+ <div class="scarab-canvas">
+ <form name="mainform" action="$link.setPage("IssueTypeList.vm")">
+ <h3 class="functnbar" style="margin-left:-2px;margin-right:-1px;">
+ <table border="0" cellspacing="0" cellpadding="0">
+ <tr>
+ <td width="100%">
+ $l10n.QueryControlViewBy
+ <select name="attribute_id" onchange="submit()">
+ #foreach ($attr in $availableAttributes)
+ #set ($atrid = $attr.AttributeId)
+ <option value="$attr.AttributeId"#if($currentAttributeId == $atrid) selected="selected"#end>$attr.Name</option>
+ #end
+ </select>
+ </td>
+
+ <td>
+ <div class="scarab-toolgroup">
+ <div class="scarab-tooltip" id="description" onclick="hideTooltip()" >
+ <table>
+ <tr>
+ <td colspan="2" style="white-space:normal">$l10n.format("ToQuery", $l10n.DefineQuery)</td>
+ </tr>
+ <tr>
+ <td colspan="2" style="white-space:normal">$l10n.ToQuery2</td>
+ </tr>
+ <tr>
+ <td colspan="2" style="white-space:normal">$l10n.ToQuery3</td>
+ </tr>
+ <tr>
+ <td colspan="2" style="white-space:normal">$l10n.ToQuery4</td>
+ </tr>
+ </table>
+ </div>
+ </div>
+ </td>
+
+ <td><img id="help"
+ src="$imgpath/icon_help_sml.gif"
+ onClick="showDelayedTooltip('description',0)"
+ >
+ </td>
+ </tr>
+ </table>
+ </h3>
+ </form>
+ <div class="axial">
+
+ <form name="issuetypelist" method="post" action="$link.setPage("IssueTypeList.vm")">
+ <input type="hidden" name="attribute_id" value="$currentAttributeId"/>
+ <input type="hidden" name="action" value="DefineXModuleList" />
+ <input type="hidden" name="queryString" value="$!data.Parameters.getString("queryString")" />
+ <input type="hidden" name="queryId" value="$!data.Parameters.getString("queryId")" />
+ <input type="hidden" name="$scarabG.Constant.LAST_TEMPLATE" value="IssueTypeList.vm" />
+ <input type="hidden" name="$scarabG.Constant.NEXT_TEMPLATE" value="AdvancedQuery.vm" />
+
+ #createMITList("Finished" $l10n.DefineQuery $user "IssueTypeList.vm" $l10n.SelectSaveXModuleQuery)
+
+ ## $showOtherModuleSection will be set in the createMITList macro
+ #set ($mitList = $user.CurrentMITList)
+ #if ((!$mitList || $mitList.isEmpty()) && $showOtherModuleSection)
+ <h3>$l10n.PredefinedLists</h3>
+ #set($manager = $scarabG.MITListManager)
+ #set($key = "pd_list_id")
+ #set($checked = !$data.Parameters.getString($key, "").startsWith("oneitallmods"))
+ <div class="colbar">
+ <p>$l10n.ChoosePredefinedList</p>
+ <p><input type="radio" name="$key" value="allmits"
+ #if($checked) checked="checked"#end />$l10n.AllModulesAndIssueTypes</p>
+
+ #foreach ($issueType in $user.CurrentModule.getIssueTypes(false))
+ #set ($issueTypeName = $issueType.getDisplayName($module))
+ #set ($value = "oneitallmods_$issueType.QueryKey")
+ #set ($checked = $data.Parameters.getString($key, "") == $value)
+ <p><input type="radio" name="$key" value="$value"#if($checked) checked="checked"#end />$l10n.format("CurrentIssueTypeAllModules", "$issueTypeName")</p>
+ #end
+ </div>
+
+ <div class="functnbar2">
+ <input type="submit" name="eventSubmit_doGotoquerywithinternallist" value="$l10n.DefineQuery" />
+ </div>
+ #end
+ $intake.declareGroups()
+ </form>
+ </div>
+</div>
+
+#end
+
#macro (prepRMITPageLink $screenTemplate)
#set ($dummy = $link.setPage($screenTemplate).setPathInfo("resultsPerPage", "$resultsPerPage").setPathInfo("searchString", $searchString).setPathInfo("searchField", $searchField).setPathInfo("sortColumn", "$sortColumn").setPathInfo("sortPolarity", "$sortPolarity"))
#end
Modified: trunk/src/webapp/WEB-INF/templates/navigations/CommonLinks.vm
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/webapp/WEB-INF/templates/navigations/CommonLinks.vm?view=diff&rev=10257&p1=trunk/src/webapp/WEB-INF/templates/navigations/CommonLinks.vm&p2=trunk/src/webapp/WEB-INF/templates/navigations/CommonLinks.vm&r1=10256&r2=10257
==============================================================================
--- trunk/src/webapp/WEB-INF/templates/navigations/CommonLinks.vm (original)
+++ trunk/src/webapp/WEB-INF/templates/navigations/CommonLinks.vm 2006-08-07 15:43:30-0700
@@ -12,7 +12,7 @@
#set ($parameterKey = "curit")
#set ($issueType = $lastEntered)
#end
- <div>$link.setPage($scarabR.getNextEntryTemplate($issueType)).setLabel("$l10n.format('EnterNewIssueType', $module.getRModuleIssueType($issueType).DisplayName.toLowerCase())").addPathInfo($parameterKey, $value).addPathInfo("eventSubmit_doStart", "foo").setAction("ReportIssue")</div>
+ <div>$link.setPage($scarabR.getNextEntryTemplate($issueType)).setLabel("$l10n.format('EnterNewIssueType', $module.getRModuleIssueType($issueType).DisplayName)").addPathInfo($parameterKey, $value).addPathInfo("eventSubmit_doStart", "foo").setAction("ReportIssue")</div>
#end
#end
Modified: trunk/src/webapp/WEB-INF/templates/screens/AdvancedQuery.vm
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/webapp/WEB-INF/templates/screens/AdvancedQuery.vm?view=diff&rev=10257&p1=trunk/src/webapp/WEB-INF/templates/screens/AdvancedQuery.vm&p2=trunk/src/webapp/WEB-INF/templates/screens/AdvancedQuery.vm&r1=10256&r2=10257
==============================================================================
--- trunk/src/webapp/WEB-INF/templates/screens/AdvancedQuery.vm (original)
+++ trunk/src/webapp/WEB-INF/templates/screens/AdvancedQuery.vm 2006-08-07 15:43:30-0700
@@ -1,6 +1,6 @@
<div class="app" id="advancedquery">
#set ($user = $data.User)
-$user.setHomePage('query')
+##$user.setHomePage('query')
#set ($mitlist = $user.CurrentMITList)
#if ($mitlist)
<form action="$link.setPage("AdvancedQuery.vm")" method="post">
Modified: trunk/src/webapp/WEB-INF/templates/screens/IssueList.vm
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/webapp/WEB-INF/templates/screens/IssueList.vm?view=diff&rev=10257&p1=trunk/src/webapp/WEB-INF/templates/screens/IssueList.vm&p2=trunk/src/webapp/WEB-INF/templates/screens/IssueList.vm&r1=10256&r2=10257
==============================================================================
--- trunk/src/webapp/WEB-INF/templates/screens/IssueList.vm (original)
+++ trunk/src/webapp/WEB-INF/templates/screens/IssueList.vm 2006-08-07 15:43:30-0700
@@ -119,19 +119,16 @@
<th>$l10n.IssueType</th>
#end
<th>
- #if (!$sortColumn || $sortColumn.length() == 0)
+ #prepIssueListPageLink()
+ #if (!$sortColumn && !$sortInternal )
#if ($sortPolarity.equals('desc'))
- #prepIssueListPageLink()
#set ($arrowLink = $link.setPathInfo('sortPolarity', 'asc').addPathInfo('sortColumn', '').addPathInfo('searchType', $searchType))
- <a href="$arrowLink"><img src="$staticLink.setPath('/images/icon_downarrow_on.gif')" width="13" height="8" alt="$l10n.SortDescending" title="$l10n.SortDescending" border="0" /></a> 
+ <a href="$arrowLink"><img src="$staticLink.setPath('/images/icon_downarrow_on.gif')" width="13" height="8" alt="$l10n.SortDescending" title="$l10n.SortDescending" border="0" />$l10n.IssueId</a>
#else
- #prepIssueListPageLink()
#set ($arrowLink = $link.setPathInfo("sortPolarity", "desc").addPathInfo("sortColumn", "").addPathInfo("searchType","$searchType"))
- <a href="$arrowLink"><img src="$staticLink.setPath("/images/icon_uparrow_on.gif")" width="13" height="8" alt="$l10n.SortAscending" title="$l10n.SortAscending" border="0" /></a> 
+ <a href="$arrowLink"><img src="$staticLink.setPath("/images/icon_uparrow_on.gif")" width="13" height="8" alt="$l10n.SortAscending" title="$l10n.SortAscending" border="0" />$l10n.IssueId</a>
#end
- $l10n.IssueId
#else
- #prepIssueListPageLink()
#set ($sortLink = $link.setPathInfo("sortColumn","").setPathInfo("sortPolarity", $sortPolarity).addPathInfo("searchType","$searchType"))
<a href="$sortLink">$l10n.IssueId</a>
#end
@@ -152,24 +149,29 @@
#set ($value = $pref.Attribute.Name)
#end
#end
- <th>
- #if ($sortColumn.equals($pref.AttributeId.toString()) || $sortInternal.equals($pref.Name))
- #if ($sortPolarity.equals("desc"))
- #prepIssueListPageLink()
- #set ($arrowLink = $link.setPathInfo("sortPolarity", "asc").setPathInfo($sort, "$sortData").addPathInfo("searchType","$searchType"))
- <a href="$arrowLink"><img src="$staticLink.setPath("/images/icon_downarrow_on.gif")" width="13" height="8" alt="$l10n.SortDescending" title="$l10n.SortDescending" border="0" /></a> 
- #else
- #prepIssueListPageLink()
- #set ($arrowLink = $link.setPathInfo("sortPolarity", "desc").setPathInfo($sort, "$sortData").addPathInfo("searchType","$searchType"))
- <a href="$arrowLink"><img src="$staticLink.setPath("/images/icon_uparrow_on.gif")" width="13" height="8" alt="$l10n.SortAscending" title="$l10n.SortAscending" border="0" /></a> 
- #end
- $value
+ <th>
+ #prepIssueListPageLink()
+ #if ($sortColumn.equals($pref.AttributeId.toString()) || $sortInternal.equals($pref.Name))
+ #if ($sortPolarity.equals("desc"))
+ #set ($arrowLink = $link.setPathInfo("sortPolarity", "asc").setPathInfo($sort, "$sortData").addPathInfo("searchType","$searchType"))
+ <a href="$arrowLink"><img src="$staticLink.setPath("/images/icon_downarrow_on.gif")" width="13" height="8" alt="$l10n.SortDescending" title="$l10n.SortDescending" border="0" /></a>
+
+ #prepIssueListPageLink()
+ #set ($arrowLink = $link.setPathInfo("sortPolarity", "asc").setPathInfo($sort, "$sortData").addPathInfo("searchType","$searchType"))
+ <a href="$arrowLink">$value</a>
#else
+ #set ($arrowLink = $link.setPathInfo("sortPolarity", "desc").setPathInfo($sort, "$sortData").addPathInfo("searchType","$searchType"))
+ <a href="$arrowLink"><img src="$staticLink.setPath("/images/icon_uparrow_on.gif")" width="13" height="8" alt="$l10n.SortAscending" title="$l10n.SortAscending" border="0" /></a>
+
#prepIssueListPageLink()
- #set ($sortLink = $link.setPathInfo($sort, "$sortData").setPathInfo("sortPolarity", "$sortPolarity").addPathInfo("searchType","$searchType"))
- <a href="$sortLink">$value</a>
- #end
- </th>
+ #set ($arrowLink = $link.setPathInfo("sortPolarity", "asc").setPathInfo($sort, "$sortData").addPathInfo("searchType","$searchType"))
+ <a href="$arrowLink">$value</a>
+ #end
+ #else
+ #set ($sortLink = $link.setPathInfo($sort, "$sortData").setPathInfo("sortPolarity", "$sortPolarity").addPathInfo("searchType","$searchType"))
+ <a href="$sortLink">$value</a>
+ #end
+ </th>
#end
</tr> <!-- END of HEADER -->
<tr> <!-- DATA -->
@@ -187,7 +189,6 @@
<td>$scarabR.getIssue($record.UniqueId).RModuleIssueType.DisplayName</td>
#end
<td><a href="$link">$record.UniqueId</a></td>
- $record.populateInternalAttributes($scarabR.RModuleUserAttributes, $l10n)
#foreach ($value in $record.AttributeValuesAsCSV)
<td>
#if ($value.length() == 0)
Modified: trunk/src/webapp/WEB-INF/templates/screens/IssueTypeList.vm
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/webapp/WEB-INF/templates/screens/IssueTypeList.vm?view=diff&rev=10257&p1=trunk/src/webapp/WEB-INF/templates/screens/IssueTypeList.vm&p2=trunk/src/webapp/WEB-INF/templates/screens/IssueTypeList.vm&r1=10256&r2=10257
==============================================================================
--- trunk/src/webapp/WEB-INF/templates/screens/IssueTypeList.vm (original)
+++ trunk/src/webapp/WEB-INF/templates/screens/IssueTypeList.vm 2006-08-07 15:43:30-0700
@@ -1,112 +1,11 @@
#set ($user = $data.User)
-#set ($imgpath = $staticLink.setPath('/images') )
+$user.setHomePage("matrix")
-#set ($currentModule = $scarabR.CurrentModule)
-#set ($availableAttributes = $currentModule.AllOptionAttributes)
-#set ($currentAttributeId = $data.Parameters.getInteger("attribute_id", 0) )
-#if ($currentAttributeId == 0)
- #if ($scarabR.hasSessionAttribute("attribute_id") )
- #set ($currentAttributeId = $scarabR.getSessionAttribute("attribute_id") )
+<div class="app" id="xmodulelist">
+ #if ($user.hasAnySearchableRMITs())
+ #renderQueryMatrix()
#else
- #set ($currentAttributeId = $availableAttributes.get(0).AttributeId )
+ <p><em>$l10n.NoMoreIssueTypes</em></p>
#end
-#end
-#set ($dummy = $scarabR.setSessionAttribute("attribute_id", $currentAttributeId))
-
-$user.setHomePage("query")
-<div class="app" id="xmodulelist">
-
-#if ($user.hasAnySearchableRMITs())
-
- <div class="scarab-canvas">
- <form name="mainform" action="$link.setPage("IssueTypeList.vm")">
- <h3 class="functnbar" style="margin-left:-2px;margin-right:-1px;">
- <table border="0" cellspacing="0" cellpadding="0">
- <tr>
- <td width="100%">
- $l10n.QueryControlViewBy
- <select name="attribute_id" onchange="submit()">
- #foreach ($attr in $availableAttributes)
- #set ($atrid = $attr.AttributeId)
- <option value="$attr.AttributeId"#if($currentAttributeId == $atrid) selected="selected"#end>$attr.Name</option>
- #end
- </select>
- </td>
-
- <td>
- <div class="scarab-toolgroup">
- <div class="scarab-tooltip" id="description" onclick="hideTooltip()" >
- <table>
- <tr>
- <td colspan="2" style="white-space:normal">$l10n.format("ToQuery", $l10n.DefineQuery)</td>
- </tr>
- <tr>
- <td colspan="2" style="white-space:normal">$l10n.ToQuery2</td>
- </tr>
- <tr>
- <td colspan="2" style="white-space:normal">$l10n.ToQuery3</td>
- </tr>
- <tr>
- <td colspan="2" style="white-space:normal">$l10n.ToQuery4</td>
- </tr>
- </table>
- </div>
- </div>
- </td>
-
- <td><img id="help"
- src="$imgpath/icon_help_sml.gif"
- onClick="showDelayedTooltip('description',0)"
- >
- </td>
- </tr>
- </table>
- </h3>
- </form>
- <div class="axial">
-
- <form name="issuetypelist" method="post" action="$link.setPage("IssueTypeList.vm")">
- <input type="hidden" name="attribute_id" value="$currentAttributeId"/>
- <input type="hidden" name="action" value="DefineXModuleList" />
- <input type="hidden" name="queryString" value="$!data.Parameters.getString("queryString")" />
- <input type="hidden" name="queryId" value="$!data.Parameters.getString("queryId")" />
- <input type="hidden" name="$scarabG.Constant.LAST_TEMPLATE" value="IssueTypeList.vm" />
- <input type="hidden" name="$scarabG.Constant.NEXT_TEMPLATE" value="AdvancedQuery.vm" />
-
-#createMITList("Finished" $l10n.DefineQuery $user "IssueTypeList.vm" $l10n.SelectSaveXModuleQuery)
-
-## $showOtherModuleSection will be set in the createMITList macro
-#set ($mitList = $user.CurrentMITList)
-#if ((!$mitList || $mitList.isEmpty()) && $showOtherModuleSection)
- <h3>$l10n.PredefinedLists</h3>
- #set($manager = $scarabG.MITListManager)
- #set($key = "pd_list_id")
- #set($checked = !$data.Parameters.getString($key, "").startsWith("oneitallmods"))
- <div class="colbar">
- <p>$l10n.ChoosePredefinedList</p>
- <p><input type="radio" name="$key" value="allmits"
- #if($checked) checked="checked"#end />$l10n.AllModulesAndIssueTypes</p>
-
- #foreach ($issueType in $user.CurrentModule.getIssueTypes(false))
- #set ($issueTypeName = $issueType.getDisplayName($module))
- #set ($value = "oneitallmods_$issueType.QueryKey")
- #set ($checked = $data.Parameters.getString($key, "") == $value)
- <p><input type="radio" name="$key" value="$value"#if($checked) checked="checked"#end />$l10n.format("CurrentIssueTypeAllModules", "$issueTypeName")</p>
- #end
- </div>
-
- <div class="functnbar2">
- <input type="submit" name="eventSubmit_doGotoquerywithinternallist" value="$l10n.DefineQuery" />
- </div>
-#end
-
- $intake.declareGroups()
- </form>
- </div>
-</div>
-
-#else
- <p><em>$l10n.NoMoreIssueTypes</em></p>
-#end
-</div>
+</div>
\ No newline at end of file
Modified: trunk/src/webapp/WEB-INF/templates/screens/Search.vm
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/webapp/WEB-INF/templates/screens/Search.vm?view=diff&rev=10257&p1=trunk/src/webapp/WEB-INF/templates/screens/Search.vm&p2=trunk/src/webapp/WEB-INF/templates/screens/Search.vm&r1=10256&r2=10257
==============================================================================
--- trunk/src/webapp/WEB-INF/templates/screens/Search.vm (original)
+++ trunk/src/webapp/WEB-INF/templates/screens/Search.vm 2006-08-07 15:43:30-0700
@@ -1,6 +1,6 @@
<div class="app" id="search">
#set ($user = $data.User)
-$user.setHomePage("query")
+##$user.setHomePage("query")
#set ($mitlist = $user.CurrentMITList)
#if (!$mitlist.isSingleModuleIssueType())
<p class="infomark"><em>$l10n.IssueTypeListMoreThanOne</em></p>
Modified: trunk/src/webapp/WEB-INF/templates/screens/admin/ModifyModule.vm
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/webapp/WEB-INF/templates/screens/admin/ModifyModule.vm?view=diff&rev=10257&p1=trunk/src/webapp/WEB-INF/templates/screens/admin/ModifyModule.vm&p2=trunk/src/webapp/WEB-INF/templates/screens/admin/ModifyModule.vm&r1=10256&r2=10257
==============================================================================
--- trunk/src/webapp/WEB-INF/templates/screens/admin/ModifyModule.vm (original)
+++ trunk/src/webapp/WEB-INF/templates/screens/admin/ModifyModule.vm 2006-08-07 15:43:30-0700
@@ -166,6 +166,20 @@
#end
+ <tr>
+ <th nowrap="nowrap">render engine</th>
+ <td>
+ #set ($name = $scarabG.ParameterName.COMMENT_RENDER_ENGINE)
+ #set ($selected = $editModule.commentRenderingEngine)
+ <select name="$name">
+ <option value="" #if ($selected.equals("")) selected #end>choose...</option>
+ <option value="plaintext" #if ($selected.equals("plaintext")) selected #end>plaintext</option>
+ <option value="html" #if ($selected.equals("html")) selected #end>html</option>
+ <option value="radeox" #if ($selected.equals("radeox")) selected #end>wiki(radeox)</option>
+ </select>
+ render engine to be used for comments.
+ </td>
+ </tr>
<tr>
<th nowrap="nowrap">$l10n.ReasonFieldRequired</th>
Modified: trunk/src/webapp/WEB-INF/templates/viewIssue/ViewIssueTab1.vm
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/webapp/WEB-INF/templates/viewIssue/ViewIssueTab1.vm?view=diff&rev=10257&p1=trunk/src/webapp/WEB-INF/templates/viewIssue/ViewIssueTab1.vm&p2=trunk/src/webapp/WEB-INF/templates/viewIssue/ViewIssueTab1.vm&r1=10256&r2=10257
==============================================================================
--- trunk/src/webapp/WEB-INF/templates/viewIssue/ViewIssueTab1.vm (original)
+++ trunk/src/webapp/WEB-INF/templates/viewIssue/ViewIssueTab1.vm 2006-08-07 15:43:30-0700
@@ -1,10 +1,11 @@
#macro (initializeTabLink)
- #set ($tabLink = $link.setPage("ViewIssue.vm").addPathInfo("id", "$currentIssue.UniqueId").addPathInfo("eventSubmit_doSetissueview", "foo").setAction("ViewIssue").toString())
+ #set ($tabLink = $link.setPage("ViewIssue.vm").addPathInfo("id", "$currentIssue.UniqueId").addPathInfo("eventSubmit_doSetissueview", "foo").setAction("ViewIssue"))
#foreach ($prevNextId in $prevNextList)
#set ($dummy = $tabLink.addPathInfo("issueList", $prevNextId))
#end
#end
+#set ($canAddComment = $scarabR.hasPermission($scarabG.Permission.ISSUE__COMMENT, $module) && $rmit.Active)
<h3 onClick=smartToggleVisibility('properties')><img name="properties.state" src="$staticLink.setPath($iconCollapse)"/>$l10n.IssueAttributesNavi</h3>
<div id='properties'>
@@ -18,12 +19,10 @@
<td width="*">
#initializeTabLink()
#if ($currentIssue.isBlocked())
- <a class="blockedmark" STYLE="text-decoration: none" title="$l10n.IssueCurrentlyBlocked" href="$tabLink.addPathInfo("tab", "6")">$l10n.BlockedWarning</a>
+ <a class="blockedmark" STYLE="text-decoration: none" title="$l10n.IssueCurrentlyBlocked" href='$tabLink.addPathInfo("tab", "6")'>$l10n.BlockedWarning</a>
#end
-
- #initializeTabLink()
#if ($currentIssue.isBlockingAnyIssue())
- <a class="blockingmark" STYLE="text-decoration: none" title="$l10n.IssueDoesBlockOtherIssues" href="$tabLink.addPathInfo("tab", "6")">$l10n.BlockingWarning</a>
+ <a class="blockingmark" STYLE="text-decoration: none" title="$l10n.IssueDoesBlockOtherIssues" href='$tabLink.addPathInfo("tab", "6")'>$l10n.BlockingWarning</a>
#end
</td>
</tr>
@@ -156,7 +155,9 @@
<th nowrap="nowrap">#if($module.isIssueReasonRequired())#showAsterisk()#end$l10n.ReasonSavedAs</th>
<td>
<input type="radio" name="saveReasonAs" value="history" checked="checked"> $l10n.History</input>
- <input type="radio" name="saveReasonAs" value="comment" > $l10n.Comment </input>
+ #if ($canAddComment)
+ <input type="radio" name="saveReasonAs" value="comment" > $l10n.Comment </input>
+ #end
$l10n.EnterReasonAs
#fieldErrorMsg($attCommentGroup.Data "")
Modified: trunk/src/webapp/WEB-INF/templates/viewIssue/ViewIssueTab3.vm
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/webapp/WEB-INF/templates/viewIssue/ViewIssueTab3.vm?view=diff&rev=10257&p1=trunk/src/webapp/WEB-INF/templates/viewIssue/ViewIssueTab3.vm&p2=trunk/src/webapp/WEB-INF/templates/viewIssue/ViewIssueTab3.vm&r1=10256&r2=10257
==============================================================================
--- trunk/src/webapp/WEB-INF/templates/viewIssue/ViewIssueTab3.vm (original)
+++ trunk/src/webapp/WEB-INF/templates/viewIssue/ViewIssueTab3.vm 2006-08-07 15:43:30-0700
@@ -22,7 +22,7 @@
#if ($comments.isEmpty() && !$canAddComment)
$l10n.NoComments
#else
- #if ($canAddComment && !$isEditComments)
+ #if ($canAddComment && !$isEditComments && !$tab.equals("all"))
<h4>$l10n.EnterComment</h4>
<table cellspacing="2" cellpadding="3" border="0" width="100%">
<tr>
Modified: trunk/www/users.html
Url: http://scarab.tigris.org/source/browse/scarab/trunk/www/users.html?view=diff&rev=10257&p1=trunk/www/users.html&p2=trunk/www/users.html&r1=10256&r2=10257
==============================================================================
--- trunk/www/users.html (original)
+++ trunk/www/users.html 2006-08-07 15:43:30-0700
@@ -1,68 +1,68 @@
-<!-- $Id: index.html 10119 2006-05-27 15:12:31Z dabbous $ -->
-<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-<title>Scarab: Flexible artifact management</title>
-</head>
-<body bgcolor="#F0F0F0">
-<table border="0" cellpadding="2" width="98%" bgcolor="#ffffff" >
-
- <tr>
- <td bgcolor="#f0f0f0">
- <p>
- There are quite a few companies using Scarab in production. Some of them
- have allowed us to publish their contact data. We would appreciate to also
- find your company mentioned here. So in case it applies, please send a short
- info to the Scarab devlist containg the contact data and we will add you to the list.
- </p>
- <table border="1">
- <tr>
- <th align="left">company</th>
- <th align="left">usage</th>
- <th align="left">contact</th>
- <th align="left">logo</th>
- </tr>
- <tr>
- <td valign="top"><a href="http://www.saxess.de">Saxess Software Design</a></td>
- <td valign="top">bugtracking</td>
- <td valign="top"><a href="mailto:[email protected]">Hussayn Dabbous</a></td>
- <td align="middle" valign="top" bgcolor="white"><img src="http://www.saxess.net/images/company-logo.gif" border="0"/></td>
- </tr>
- <tr>
- <td valign="top"><a href="http://www.beachsolutions.com">Beach Solutions Limited</a></td>
- <td valign="top">Defect tracking; enhancement prioritisation</td>
- <td valign="top"><a href="mailto:[email protected]">Steve James</a></td>
- <td valign="top"><img src="http://www.beachsolutions.com/images/bs-logo.gif" border="0"/></td>
- </tr>
- <tr>
- <td valign="top"><a href="http://www.forcam.de/">FORCAM GmbH</a></td>
- <td valign="top">bug tracking, requirements management</td>
- <td valign="top">Dr. Ulrich Hirsch</td>
- </tr>
- <tr>
- <td valign="top"><a href="http://www.s-tec.de/">S-Tec Datenverarbeitung GmbH</a></td>
- <td valign="top">bug tracking, requirements management</td>
- <td valign="top">Dr. Joachim Schnitter</td>
- </tr>
- <tr>
- <td valign="top"><a href="http://www.kobold.com.au">KoBold Systems</a></td>
- <td valign="top">Defect/Enhancement tracking</td>
- <td valign="top"><a href="mailto:[email protected]">Daniel F Garcia</a></td>
- <td align="middle" valign="top"><img src="http://www.kobold.com.au/KoboldSystems160x75.gif" border="0"/></td>
- </tr>
- <!--
- <tr>
- <td valign="top"><a href=""></a></td>
- <td valign="top"></td>
- <td valign="top"><a href="mailto:"></a></td>
- <td align="middle" valign="top"><img src="" border="0"/></td>
- </tr>
- -->
- </table>
- </tr>
-
-</table>
-<br/>
-</body>
-</html>
+<!-- $Id: index.html 10119 2006-05-27 15:12:31Z dabbous $ -->
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<title>Scarab: Flexible artifact management</title>
+</head>
+<body bgcolor="#F0F0F0">
+<table border="0" cellpadding="2" width="98%" bgcolor="#ffffff" >
+
+ <tr>
+ <td bgcolor="#f0f0f0">
+ <p>
+ There are quite a few companies using Scarab in production. Some of them
+ have allowed us to publish their contact data. We would appreciate to also
+ find your company mentioned here. So in case it applies, please send a short
+ info to the Scarab devlist containg the contact data and we will add you to the list.
+ </p>
+ <table border="1">
+ <tr>
+ <th align="left">company</th>
+ <th align="left">usage</th>
+ <th align="left">contact</th>
+ <th align="left">logo</th>
+ </tr>
+ <tr>
+ <td valign="top"><a href="http://www.saxess.de">Saxess Software Design</a></td>
+ <td valign="top">bugtracking</td>
+ <td valign="top"><a href="mailto:[email protected]">Hussayn Dabbous</a></td>
+ <td align="middle" valign="top" bgcolor="white"><img src="http://www.saxess.net/images/company-logo.gif" border="0"/></td>
+ </tr>
+ <tr>
+ <td valign="top"><a href="http://www.beachsolutions.com">Beach Solutions Limited</a></td>
+ <td valign="top">Defect tracking; enhancement prioritisation</td>
+ <td valign="top"><a href="mailto:[email protected]">Steve James</a></td>
+ <td valign="top"><img src="http://www.beachsolutions.com/images/bs-logo.gif" border="0"/></td>
+ </tr>
+ <tr>
+ <td valign="top"><a href="http://www.forcam.de/">FORCAM GmbH</a></td>
+ <td valign="top">bug tracking, requirements management</td>
+ <td valign="top">Dr. Ulrich Hirsch</td>
+ </tr>
+ <tr>
+ <td valign="top"><a href="http://www.s-tec.de/">S-Tec Datenverarbeitung GmbH</a></td>
+ <td valign="top">bug tracking, requirements management</td>
+ <td valign="top">Dr. Joachim Schnitter</td>
+ </tr>
+ <tr>
+ <td valign="top"><a href="http://www.kobold.com.au">KoBold Systems</a></td>
+ <td valign="top">Defect/Enhancement tracking</td>
+ <td valign="top"><a href="mailto:[email protected]">Daniel F Garcia</a></td>
+ <td align="middle" valign="top"><img src="http://www.kobold.com.au/KoboldSystems160x75.gif" border="0"/></td>
+ </tr>
+ <!--
+ <tr>
+ <td valign="top"><a href=""></a></td>
+ <td valign="top"></td>
+ <td valign="top"><a href="mailto:"></a></td>
+ <td align="middle" valign="top"><img src="" border="0"/></td>
+ </tr>
+ -->
+ </table>
+ </tr>
+
+</table>
+<br/>
+</body>
+</html>
Modified: trunk/xdocs/changes.xml
Url: http://scarab.tigris.org/source/browse/scarab/trunk/xdocs/changes.xml?view=diff&rev=10257&p1=trunk/xdocs/changes.xml&p2=trunk/xdocs/changes.xml&r1=10256&r2=10257
==============================================================================
--- trunk/xdocs/changes.xml (original)
+++ trunk/xdocs/changes.xml 2006-08-07 15:43:30-0700
@@ -7,10 +7,22 @@
<body>
<release version="b21" date="in-development">
+ <action dev="pledbrook" type="fix" due-to="Ronny Voelker" fix="SCB1736">
+ Sorting on the "Created By" and "Modified By" attributes now works
+ without any problems.
+ </action>
+ <action dev="pledbrook" type="fix" due-to="Ronny Voelker" fix="SCB1773">
+ Permission and role changes no longer require the container, e.g. tomcat,
+ to be restarted in order for them to take effect.
+ </action>
+ <action dev="jorgeuriarte" type="add" fix="SCB1407">
+ Added support for NTLM (Windows) login integration. Take a look at
+ <a href="howto/windowsdomain-howto.html">this howto</a>.
+ </action>
<action dev="jorgeuriarte" type="add" fix="SCB1565">
Date and user of issue-creation and last-modification are now availaible in search results' output.
</action>
- <action dev="jorgeuriarte" due-to="Ricardo Amillategui" fix="SCB1708">
+ <action dev="jorgeuriarte" type="fix" due-to="Ricardo Amillategui" fix="SCB1708">
Attribute fields could not be undefined once setted.
</action>
<action dev="pledbrook" type="add">
Modified: trunk/xdocs/howto/index.xml
Url: http://scarab.tigris.org/source/browse/scarab/trunk/xdocs/howto/index.xml?view=diff&rev=10257&p1=trunk/xdocs/howto/index.xml&p2=trunk/xdocs/howto/index.xml&r1=10256&r2=10257
==============================================================================
--- trunk/xdocs/howto/index.xml (original)
+++ trunk/xdocs/howto/index.xml 2006-08-07 15:43:30-0700
@@ -17,8 +17,8 @@
<li><a href="release-howto.html">Releasing Scarab Howto</a></li>
<li><a href="firewall-howto.html">Scarab Behind Firewall Howto</a></li>
<li><a href="tuning-howto.html">Tuning Howto</a></li>
+ <li><a href="windowsdomain-howto.html">Authenticating in a Windows domain</a></li>
<li><a href="customize-howto.html">Customizing Scarab Howto</a></li>
-
</ul>
</p>
</section>
Modified: trunk/xdocs/scarab_properties.xml
Url: http://scarab.tigris.org/source/browse/scarab/trunk/xdocs/scarab_properties.xml?view=diff&rev=10257&p1=trunk/xdocs/scarab_properties.xml&p2=trunk/xdocs/scarab_properties.xml&r1=10256&r2=10257
==============================================================================
--- trunk/xdocs/scarab_properties.xml (original)
+++ trunk/xdocs/scarab_properties.xml 2006-08-07 15:43:30-0700
@@ -522,6 +522,30 @@
deploy
</details>
+ <group name="module">
+ <property>
+ <name>scarab.issue.comment.renderer</name>
+ <default>plaintext</default>
+ <comment>
+ determines the default rendering engine ("plaintext"|"html"|"radeox").
+ </comment>
+ <type>Runtime</type>
+ <customization modification="optional">advanced</customization>
+ <file/>
+ <details>
+ Scarab can display issue comments in three ways. Either
+ all comments are simply rendered as plaintext ("plaintext", the default),
+ or they are rendered using a very restricted subset of html ("html")
+ or they are rendered using the wiki syntax of the radeox
+ wiki rendering engine ("radeox"). The used rendering engine
+ can be configured individually for each module from within
+ the module editor. The value given in this property only
+ defines the default engine to be used when it has not yet
+ been defined in the module.
+ </details>
+ </property>
+ </group>
+
<group name="email">
<details>
Following Email related properties are derived properties.
@@ -825,6 +849,42 @@
<file/>
</property>
+ <group name="NTLM domain">
+ <details>
+ These properties will allow Scarab to try to authenticate users against a
+ NTLM domain (windows network), using credentials provided by the browser.
+
+ Scarab ships with an empty implementation jar for the JCIFS library. To activate this
+ feature you'll need to download the real implementation and replace the shipped jcifs.jar
+ with it.
+
+ You can download it from:
+
+ - http://jcifs.samba.org (official site)
+ - http://www.ibiblio.org/maven/org.samba.jcifs/jars/jcifs-1.2.6.jar (tested version)
+
+ </details>
+ <property>
+ <name>scarab.login.ntlm.active</name>
+ <default>false</default>
+ <details>
+ If set to true, the system will try to authenticate users against an NTLM domain.
+ This property needs scarab.login.ntlm.domain to work.
+ </details>
+ <type>Runtime</type>
+ <file/>
+ </property>
+ <property>
+ <name>scarab.login.ntlm.domain</name>
+ <default></default>
+ <details>
+ The name of the NTLM domain to authenticate users, if scarab.login.ntlm.active is TRUE.
+ </details>
+ <type>Runtime</type>
+ <file/>
+ </property>
+ </group>
+
<property>
<name>scarab.workflow.classname</name>
<default>org.tigris.scarab.workflow.CheapWorkflow</default>
lmpx.com only provides a reader for public news (NNTP) servers. It is not
affiliated with the servers or forums shown here and is not responsible for
the content of articles, which is written by their respective authors.