diff --git a/ccm-core/src/com/arsdigita/bebop/form/Date.java b/ccm-core/src/com/arsdigita/bebop/form/Date.java
index cf5df15bd..b80e3773b 100755
--- a/ccm-core/src/com/arsdigita/bebop/form/Date.java
+++ b/ccm-core/src/com/arsdigita/bebop/form/Date.java
@@ -36,7 +36,8 @@ import com.arsdigita.bebop.parameters.NotNullValidationListener;
// This interface contains the XML element name of this class
// in a constant which is used when generating XML
import com.arsdigita.bebop.util.BebopConstants;
-import com.arsdigita.dispatcher.DispatcherHelper;
+
+import com.arsdigita.globalization.GlobalizationHelper;
import com.arsdigita.xml.Element;
import java.text.SimpleDateFormat;
@@ -278,7 +279,7 @@ public class Date extends Widget implements BebopConstants {
public void generateLocalizedWidget(PageState ps, Element date) {
Locale defaultLocale = Locale.getDefault();
- Locale locale = DispatcherHelper.getNegotiatedLocale();
+ Locale locale = GlobalizationHelper.getNegotiatedLocale();
// Get the current Pattern
// XXX This is really, really, really, really, really, really bad
@@ -376,7 +377,7 @@ public class Date extends Widget implements BebopConstants {
private void populateMonthOptions() {
- Locale locale = DispatcherHelper.getNegotiatedLocale();
+ Locale locale = GlobalizationHelper.getNegotiatedLocale();
if (m_locale == null || (locale != null && !m_locale.equals(locale))) {
@@ -398,7 +399,7 @@ public class Date extends Widget implements BebopConstants {
m_month.addOption(new Option(String.valueOf(i), months[i]));
}
}
- m_locale = DispatcherHelper.getNegotiatedLocale();
+ m_locale = GlobalizationHelper.getNegotiatedLocale();
}
}
}
diff --git a/ccm-core/src/com/arsdigita/bebop/form/Time.java b/ccm-core/src/com/arsdigita/bebop/form/Time.java
index 75ec91ed3..00898aa9a 100755
--- a/ccm-core/src/com/arsdigita/bebop/form/Time.java
+++ b/ccm-core/src/com/arsdigita/bebop/form/Time.java
@@ -27,7 +27,7 @@ import com.arsdigita.bebop.parameters.NumberInRangeValidationListener;
import com.arsdigita.bebop.parameters.ParameterData;
import com.arsdigita.bebop.parameters.ParameterModel;
import com.arsdigita.bebop.util.BebopConstants;
-import com.arsdigita.dispatcher.DispatcherHelper;
+import com.arsdigita.globalization.GlobalizationHelper;
import com.arsdigita.util.Assert;
import com.arsdigita.xml.Element;
import java.text.DateFormat;
@@ -344,7 +344,7 @@ public class Time extends Widget implements BebopConstants {
}
private boolean has12HourClock() {
- Locale locale = DispatcherHelper.getNegotiatedLocale();
+ Locale locale = GlobalizationHelper.getNegotiatedLocale();
DateFormat format_12Hour = DateFormat.getTimeInstance(DateFormat.SHORT, Locale.US);
DateFormat format_locale = DateFormat.getTimeInstance(DateFormat.SHORT, locale);
diff --git a/ccm-core/src/com/arsdigita/bebop/page/PageTransformer.java b/ccm-core/src/com/arsdigita/bebop/page/PageTransformer.java
index c52d74671..3e88fd1ec 100755
--- a/ccm-core/src/com/arsdigita/bebop/page/PageTransformer.java
+++ b/ccm-core/src/com/arsdigita/bebop/page/PageTransformer.java
@@ -35,6 +35,7 @@ import com.arsdigita.web.Web;
import com.arsdigita.xml.Document;
import com.arsdigita.bebop.Bebop;
+import com.arsdigita.globalization.GlobalizationHelper;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
@@ -59,6 +60,7 @@ import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import com.arsdigita.templating.XSLParameterGenerator;
+import java.util.Locale;
import org.apache.log4j.Logger;
/**
@@ -88,6 +90,7 @@ public class PageTransformer implements PresentationManager {
registerXSLParameterGenerator("contextPath",
new XSLParameterGenerator() {
+ @Override
public String generateValue(HttpServletRequest request) {
return request.getContextPath();
}
@@ -96,6 +99,7 @@ public class PageTransformer implements PresentationManager {
registerXSLParameterGenerator("root-context-prefix",
new XSLParameterGenerator() {
+ @Override
public String generateValue(HttpServletRequest request) {
return Web.getConfig().getDispatcherContextPath();
}
@@ -104,6 +108,7 @@ public class PageTransformer implements PresentationManager {
registerXSLParameterGenerator("context-prefix",
new XSLParameterGenerator() {
+ @Override
public String generateValue(HttpServletRequest request) {
return Web.getContext().getRequestURL().getContextPath();
}
@@ -112,6 +117,7 @@ public class PageTransformer implements PresentationManager {
registerXSLParameterGenerator("static-prefix",
new XSLParameterGenerator() {
+ @Override
public String generateValue(HttpServletRequest request) {
return Web.getContext().getRequestURL().getContextPath()
+ com.arsdigita.web.URL.STATIC_DIR;
@@ -121,6 +127,7 @@ public class PageTransformer implements PresentationManager {
registerXSLParameterGenerator("dispatcher-prefix",
new XSLParameterGenerator() {
+ @Override
public String generateValue(HttpServletRequest request) {
return com.arsdigita.web.URL.getDispatcherPath();
}
@@ -129,6 +136,7 @@ public class PageTransformer implements PresentationManager {
registerXSLParameterGenerator("dcp-on-buttons",
new XSLParameterGenerator() {
+ @Override
public String generateValue(HttpServletRequest request) {
if (Bebop.getConfig().doubleClickProtectionOnButtons()) {
return "true";
@@ -142,6 +150,7 @@ public class PageTransformer implements PresentationManager {
registerXSLParameterGenerator("dcp-on-links",
new XSLParameterGenerator() {
+ @Override
public String generateValue(HttpServletRequest request) {
if (Bebop.getConfig().doubleClickProtectionOnLinks()) {
return "true";
@@ -156,6 +165,7 @@ public class PageTransformer implements PresentationManager {
registerXSLParameterGenerator("user-agent",
new XSLParameterGenerator() {
+ @Override
public String generateValue(HttpServletRequest request) {
return request.getHeader("User-Agent");
}
@@ -164,8 +174,19 @@ public class PageTransformer implements PresentationManager {
registerXSLParameterGenerator("negotiated-language",
new XSLParameterGenerator() {
+ @Override
public String generateValue(HttpServletRequest request) {
- return DispatcherHelper.getNegotiatedLocale().getLanguage();
+ return GlobalizationHelper.getNegotiatedLocale().getLanguage();
+ }
+ });
+
+ registerXSLParameterGenerator("selected-language",
+ new XSLParameterGenerator() {
+
+ @Override
+ public String generateValue(HttpServletRequest request) {
+ Locale selectedLocale = com.arsdigita.globalization.GlobalizationHelper.getSelectedLocale(request);
+ return (selectedLocale != null) ? selectedLocale.toString() : "";
}
});
s_log.debug("Static initalizer finished.");
@@ -247,6 +268,7 @@ public class PageTransformer implements PresentationManager {
* HttpServletResponse, Map)} to implement the
* PresentationManager interface.
*/
+ @Override
public void servePage(final Document doc,
final HttpServletRequest req,
final HttpServletResponse resp) {
diff --git a/ccm-core/src/com/arsdigita/categorization/Category.java b/ccm-core/src/com/arsdigita/categorization/Category.java
index 5671abe00..dc0350dbe 100755
--- a/ccm-core/src/com/arsdigita/categorization/Category.java
+++ b/ccm-core/src/com/arsdigita/categorization/Category.java
@@ -19,9 +19,10 @@
package com.arsdigita.categorization;
import com.arsdigita.db.Sequences;
-import com.arsdigita.dispatcher.DispatcherHelper;
+import com.arsdigita.domain.DataObjectNotFoundException;
import com.arsdigita.domain.DomainObjectFactory;
import com.arsdigita.domain.DomainServiceInterfaceExposer;
+import com.arsdigita.globalization.GlobalizationHelper;
import com.arsdigita.kernel.ACSObject;
import com.arsdigita.kernel.Kernel;
import com.arsdigita.kernel.permissions.PermissionDescriptor;
@@ -403,7 +404,7 @@ public class Category extends ACSObject {
* @return the category name.
*/
public String getName() {
- return getName(DispatcherHelper.getNegotiatedLocale().getLanguage());
+ return getName(GlobalizationHelper.getNegotiatedLocale().getLanguage());
}
/**
@@ -585,7 +586,7 @@ public class Category extends ACSObject {
*/
public String getDescription() {
return getDescription(
- DispatcherHelper.getNegotiatedLocale().getLanguage());
+ GlobalizationHelper.getNegotiatedLocale().getLanguage());
}
/**
@@ -658,7 +659,7 @@ public class Category extends ACSObject {
* @return URL component used when browsing categories
*/
public String getURL() {
- return getURL(DispatcherHelper.getNegotiatedLocale().getLanguage());
+ return getURL(GlobalizationHelper.getNegotiatedLocale().getLanguage());
}
/**
@@ -735,7 +736,7 @@ public class Category extends ACSObject {
* otherwise.
*/
public boolean isEnabled() {
- return isEnabled(DispatcherHelper.getNegotiatedLocale().getLanguage());
+ return isEnabled(GlobalizationHelper.getNegotiatedLocale().getLanguage());
}
/**
diff --git a/ccm-core/src/com/arsdigita/domain/DomainObjectXMLRenderer.java b/ccm-core/src/com/arsdigita/domain/DomainObjectXMLRenderer.java
index fe07274c9..3240a5e81 100755
--- a/ccm-core/src/com/arsdigita/domain/DomainObjectXMLRenderer.java
+++ b/ccm-core/src/com/arsdigita/domain/DomainObjectXMLRenderer.java
@@ -352,7 +352,7 @@ public class DomainObjectXMLRenderer extends DomainObjectTraversal {
// Quasimodo: BEGIN
// Add attributes for date and time
- Locale negLocale = com.arsdigita.dispatcher.DispatcherHelper.getNegotiatedLocale();
+ Locale negLocale = com.arsdigita.globalization.GlobalizationHelper.getNegotiatedLocale();
DateFormat dateFormatter = DateFormat.getDateInstance(DateFormat.MEDIUM, negLocale);
DateFormat timeFormatter = DateFormat.getTimeInstance(DateFormat.SHORT, negLocale);
element.addAttribute("date", dateFormatter.format(date));
diff --git a/ccm-core/src/com/arsdigita/formbuilder/PersistentTime.java b/ccm-core/src/com/arsdigita/formbuilder/PersistentTime.java
new file mode 100644
index 000000000..cccd23304
--- /dev/null
+++ b/ccm-core/src/com/arsdigita/formbuilder/PersistentTime.java
@@ -0,0 +1,166 @@
+package com.arsdigita.formbuilder;
+
+
+// This class is an ACSObject using BigDecimals for its ids
+import java.math.BigDecimal;
+
+// This factory creates a Time
+import com.arsdigita.bebop.form.Time;
+
+// Every PersistentComponentFactory can create a Bebop Component
+import com.arsdigita.bebop.Component;
+import com.arsdigita.bebop.form.Widget;
+
+// Id class used by internal constructor
+import com.arsdigita.persistence.OID;
+import com.arsdigita.persistence.DataObject;
+import com.arsdigita.persistence.metadata.ObjectType;
+
+// For instantiating the TimeParameter
+import com.arsdigita.bebop.parameters.TimeParameter;
+import com.arsdigita.formbuilder.util.FormBuilderUtil;
+
+// Thrown if the underlying DataObject with given id cannot be found
+import com.arsdigita.domain.DataObjectNotFoundException;
+
+// ACS 5 uses Log4J for logging
+import org.apache.log4j.Logger;
+
+
+/**
+ * This class is responsible for persisting Bebop Times. The Time
+ * is saved with the save() method. To resurrect the Time, use the constructor
+ * taking the id of the saved Time and then invoke createComponent().
+ *
+ * @author Peter Marklund
+ * @version $Id: PersistentTime.java 287 2005-02-22 00:29:02Z sskracic $
+ *
+ */
+public class PersistentTime extends PersistentWidget {
+
+ public static final String versionId = "$Id: PersistentTime.java 287 2005-02-22 00:29:02Z sskracic $ by $Author: sskracic $, $TimeTime: 2004/08/16 18:10:38 $";
+
+ private static final Logger s_log =
+ Logger.getLogger(PersistentTime.class.getName());
+
+ private Class VALUE_CLASS = new java.util.Date().getClass();
+
+ /**
+ * The fully qualified name of the underlying DataObject of this class.
+ */
+ public static final String BASE_DATA_OBJECT_TYPE =
+ "com.arsdigita.formbuilder.Widget";
+
+ // *** Constructors -------------
+
+ /**
+ * Constructor that creates a new Time domain object that
+ * can be saved to the database later on. This class was only
+ * included to make it possible to use this DomainObject with the
+ * FormGenerator (to make the class JavaBean compliant). Use the constructor
+ * taking a parameter name instead if possible.
+ */
+ public PersistentTime() {
+ this(BASE_DATA_OBJECT_TYPE);
+ }
+
+ /**
+ * Constructor that creates a new Time domain object that
+ * can be saved to the database later on.
+ */
+ public PersistentTime(String typeName) {
+ super(typeName);
+ }
+
+ public PersistentTime(ObjectType type) {
+ super(type);
+ }
+
+ public PersistentTime(DataObject obj) {
+ super(obj);
+ }
+
+ /**
+ * Constructor that retrieves an existing Time domain object
+ * from the database.
+ *
+ * @param id The object id of the Time domain object to retrieve
+ */
+ public PersistentTime(BigDecimal id)
+ throws DataObjectNotFoundException {
+
+ this(new OID(BASE_DATA_OBJECT_TYPE, id));
+ }
+
+ /**
+ * Extending classes can use this constructor to set the sub class
+ * id and object type.
+ */
+ public PersistentTime(OID oID)
+ throws DataObjectNotFoundException {
+
+ super(oID);
+ }
+
+ public static PersistentTime create(String parameterName) {
+ PersistentTime d = new PersistentTime();
+ d.setup(parameterName);
+ return d;
+ }
+
+ /**
+ * Create the Time whose persistence is managed
+ * by this domain object.
+ */
+ public Component createComponent() {
+
+ Time time = null;
+
+ // If there is a speical TimeParameterClass - instantiate that
+ if (getTimeParameter() != null) {
+
+ TimeParameter timeParameter = (TimeParameter)
+ FormBuilderUtil.instantiateObject(getTimeParameter(),
+ new Class [] {getParameterName().getClass()},
+ new Object [] {getParameterName()});
+
+ time = new Time(timeParameter);
+
+ } else {
+ time = new Time(getParameterName());
+ }
+
+ copyValuesToWidget(time);
+
+ return time;
+ }
+
+ protected void copyValuesToWidget(Widget widget) {
+ super.copyValuesToWidget(widget);
+
+ Time time = (Time)widget;
+
+ }
+
+ /**
+ * Returns a java.util.Date Class
+ */
+ protected Class getValueClass() {
+
+ return VALUE_CLASS;
+ }
+
+ //*** Attribute Methods
+ public void setTimeParameter(String timeParameterClass) {
+
+ setComponentAttribute("timeParameter", timeParameterClass);
+ }
+
+ /**
+ * Will return null if no value has been set.
+ */
+ public String getTimeParameter() {
+ return getComponentAttribute("timeParameter");
+ }
+
+}
diff --git a/ccm-core/src/com/arsdigita/globalization/GlobalizationHelper.java b/ccm-core/src/com/arsdigita/globalization/GlobalizationHelper.java
new file mode 100644
index 000000000..e3bb9bf6e
--- /dev/null
+++ b/ccm-core/src/com/arsdigita/globalization/GlobalizationHelper.java
@@ -0,0 +1,115 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package com.arsdigita.globalization;
+
+import com.arsdigita.dispatcher.DispatcherHelper;
+import com.arsdigita.kernel.Kernel;
+import com.arsdigita.kernel.KernelConfig;
+import java.util.Enumeration;
+import javax.servlet.ServletRequest;
+import java.util.Locale;
+import java.util.StringTokenizer;
+
+/**
+ *
+ * @author Sören Bernstein
+ */
+public class GlobalizationHelper {
+
+ // Don't instantiate
+ private GlobalizationHelper() {
+ }
+
+ /**
+ * This method returns the best matching locate for the request. In contrast to
+ * the other methods available this one will also respect the supported_languages
+ * config entry.
+ *
+ * @return The negotiated locale
+ */
+ public static java.util.Locale getNegotiatedLocale() {
+ KernelConfig kernelConfig = Kernel.getConfig();
+
+ // Set the preferedLocale to the default locale (first entry in the config parameter list)
+ java.util.Locale preferedLocale = getPrefferedLocale();
+
+ // The ACCEPTED_LANGUAGES from the client
+ Enumeration locales = null;
+
+ // Try to get the RequestContext
+ try {
+
+ // Get the SerrvletRequest
+ ServletRequest request = ((ServletRequest) DispatcherHelper.getRequest());
+
+ // Get the selected locale from the request, if any
+ java.util.Locale selectedLocale = getSelectedLocale(request);
+ if (selectedLocale != null && kernelConfig.hasLanguage(selectedLocale.getLanguage())) {
+ preferedLocale = selectedLocale;
+ } else {
+
+ //
+ String lang = request.getParameter("lang");
+
+ if (lang != null && kernelConfig.hasLanguage(lang)) {
+
+ preferedLocale = new Locale(lang);
+ } else {
+
+ locales = request.getLocales();
+
+ // For everey element in the enumerator
+ while (locales.hasMoreElements()) {
+
+ // Test if the current locale is listed in the supported locales list
+ java.util.Locale curLocale = (Locale) locales.nextElement();
+ if (kernelConfig.hasLanguage(curLocale.getLanguage())) {
+ preferedLocale = curLocale;
+ break;
+ }
+ }
+ }
+ }
+ } catch (NullPointerException ex) {
+ // Don't have to do anything because I want to fall back to default language anyway
+ // This case should only appear during setup
+ } finally {
+
+ return preferedLocale;
+
+ }
+ }
+
+// public static java.util.Locale getSystemLocale() {
+//
+// }
+ private static Locale getPrefferedLocale() {
+ KernelConfig kernelConfig = Kernel.getConfig();
+ java.util.Locale preferedLocale = new java.util.Locale(kernelConfig.getDefaultLanguage(), "", "");
+ return preferedLocale;
+ }
+
+ /**
+ * Get the selected (as in fixed) locale from the ServletRequest
+ *
+ * @return the selected locale as java.util.Locale or null if not defined
+ */
+ public static Locale getSelectedLocale(ServletRequest request) {
+// ServletRequest request = ((ServletRequest) DispatcherHelper.getRequest());
+ String paramValue = request.getParameter("selLang");
+ java.util.Locale selectedLocale = null;
+
+ if (paramValue != null) {
+ StringTokenizer paramValues = new StringTokenizer(paramValue, "_");
+ if (paramValues.countTokens() > 1) {
+ selectedLocale = new java.util.Locale(paramValues.nextToken(), paramValues.nextToken());
+ } else {
+ selectedLocale = new java.util.Locale(paramValues.nextToken());
+ }
+ }
+
+ return selectedLocale;
+ }
+}
diff --git a/ccm-core/src/com/arsdigita/globalization/GlobalizedMessage.java b/ccm-core/src/com/arsdigita/globalization/GlobalizedMessage.java
index 425e1add5..bc2940445 100755
--- a/ccm-core/src/com/arsdigita/globalization/GlobalizedMessage.java
+++ b/ccm-core/src/com/arsdigita/globalization/GlobalizedMessage.java
@@ -46,8 +46,7 @@ import org.apache.log4j.Logger;
public class GlobalizedMessage {
private static final Logger s_cat =
- Logger.getLogger(GlobalizedMessage.class.getName());
-
+ Logger.getLogger(GlobalizedMessage.class.getName());
private String m_key = "";
private String m_bundleName = "";
private Object[] m_args = null;
@@ -179,7 +178,8 @@ public class GlobalizedMessage {
* GlobalizedObject?
*/
public Object localize() {
- return localize(Kernel.getContext().getLocale());
+// return localize(Kernel.getContext().getLocale());
+ return localize(com.arsdigita.globalization.GlobalizationHelper.getNegotiatedLocale());
}
/**
@@ -204,7 +204,8 @@ public class GlobalizedMessage {
* GlobalizedObject?
*/
public Object localize(HttpServletRequest request) {
- return localize(Kernel.getContext().getLocale());
+// return localize(Kernel.getContext().getLocale());
+ return localize(com.arsdigita.globalization.GlobalizationHelper.getNegotiatedLocale());
}
/**
@@ -241,8 +242,7 @@ public class GlobalizedMessage {
} catch (MissingResourceException e) {
if (s_cat.isDebugEnabled()) {
s_cat.debug(
- "ResourceBundle " + getBundleName() + " was not found."
- );
+ "ResourceBundle " + getBundleName() + " was not found.");
}
}
diff --git a/ccm-core/src/com/arsdigita/search/ui/filters/DateRangeFilterWidget.java b/ccm-core/src/com/arsdigita/search/ui/filters/DateRangeFilterWidget.java
index 3cb23cc26..049f03fb2 100755
--- a/ccm-core/src/com/arsdigita/search/ui/filters/DateRangeFilterWidget.java
+++ b/ccm-core/src/com/arsdigita/search/ui/filters/DateRangeFilterWidget.java
@@ -24,7 +24,7 @@ import com.arsdigita.search.FilterSpecification;
import com.arsdigita.search.FilterType;
import com.arsdigita.xml.Element;
import com.arsdigita.bebop.PageState;
-import com.arsdigita.dispatcher.DispatcherHelper;
+import com.arsdigita.globalization.GlobalizationHelper;
import com.arsdigita.search.filters.DateRangeFilterSpecification;
@@ -74,7 +74,7 @@ public class DateRangeFilterWidget extends FilterWidget {
String x = "";
Locale defaultLocale = Locale.getDefault();
- Locale locale = DispatcherHelper.getNegotiatedLocale();
+ Locale locale = GlobalizationHelper.getNegotiatedLocale();
// Get the current Pattern
// XXX This is really, really, really, really, really, really bad
diff --git a/ccm-core/src/com/arsdigita/ui/UIResources_en.properties b/ccm-core/src/com/arsdigita/ui/UIResources_en.properties
new file mode 100755
index 000000000..ff63cc0cf
--- /dev/null
+++ b/ccm-core/src/com/arsdigita/ui/UIResources_en.properties
@@ -0,0 +1,21 @@
+ui.admin.access_denied=Access Denied
+ui.admin.nusers=nUsers
+ui.admin.help=Help
+ui.admin.signout=Sign out
+ui.admin.portal=My Portal
+ui.admin.greeting=Welcome
+ui.sitemap.site_node=Site Node:
+ui.sitemap.mounted_instance=Mounted Instance:
+ui.sitemap.enter_new_node_name_in_text_field=Enter new Node name in text field.
+ui.sitemap.are_you_sure_you_want_to_remove_this_node=Are you sure you want to remove this node?
+ui.sitemap.are_you_sure_you_want_to_umount_this_instance=Are you sure you want to umount this instance?
+ui.sitemap.enter_name_for_new_package_instance_in_text_field_then_select_a_package_to_mount_from_list=Enter name for new package instance in text field, then select a package to mount from list.
+ui.sitemap.h4sitemap_treeh4=