diff --git a/ccm-cms-assets-relatedlink/src/com/arsdigita/cms/contentassets/RelatedLinkTraversalAdapter.java b/ccm-cms-assets-relatedlink/src/com/arsdigita/cms/contentassets/RelatedLinkTraversalAdapter.java
index df45a1ac9..14b72f7a1 100644
--- a/ccm-cms-assets-relatedlink/src/com/arsdigita/cms/contentassets/RelatedLinkTraversalAdapter.java
+++ b/ccm-cms-assets-relatedlink/src/com/arsdigita/cms/contentassets/RelatedLinkTraversalAdapter.java
@@ -2,9 +2,9 @@ package com.arsdigita.cms.contentassets;
import com.arsdigita.cms.ContentBundle;
import com.arsdigita.cms.contenttypes.LinkTraversalAdapter;
-import com.arsdigita.dispatcher.DispatcherHelper;
import com.arsdigita.domain.DomainObject;
import com.arsdigita.domain.SimpleDomainObjectTraversalAdapter;
+import com.arsdigita.globalization.GlobalizationHelper;
import com.arsdigita.persistence.metadata.Property;
/**
@@ -35,8 +35,8 @@ public class RelatedLinkTraversalAdapter extends LinkTraversalAdapter {
if (obj instanceof ContentBundle) {
- nObj = ((ContentBundle) obj).negotiate(DispatcherHelper.getRequest().
- getLocales());
+ nObj = ((ContentBundle) obj).
+ getInstance(GlobalizationHelper.getNegotiatedLocale(), true);
}
if (nObj instanceof RelatedLink) {
diff --git a/ccm-cms/src/com/arsdigita/cms/ContentBundle.java b/ccm-cms/src/com/arsdigita/cms/ContentBundle.java
index af1945ef3..3f14e7e57 100755
--- a/ccm-cms/src/com/arsdigita/cms/ContentBundle.java
+++ b/ccm-cms/src/com/arsdigita/cms/ContentBundle.java
@@ -28,6 +28,7 @@ import com.arsdigita.domain.DataObjectNotFoundException;
import com.arsdigita.domain.DomainObject;
import com.arsdigita.domain.DomainObjectFactory;
import com.arsdigita.domain.DomainObjectObserver;
+import com.arsdigita.globalization.GlobalizationHelper;
import com.arsdigita.kernel.permissions.PermissionService;
import com.arsdigita.persistence.DataAssociation;
import com.arsdigita.persistence.DataAssociationCursor;
@@ -280,6 +281,14 @@ public class ContentBundle extends ContentItem {
return new ItemCollection(instances());
}
+ public final ContentItem getInstance(final Locale locale) {
+ return this.getInstance(locale.getLanguage(), false);
+ }
+
+ public final ContentItem getInstance(final Locale locale, boolean allowLanguageIndependent) {
+ return this.getInstance(locale.getLanguage(), allowLanguageIndependent);
+ }
+
/**
* Returns a language instance for language or
* null if no such instance exists.
@@ -287,7 +296,11 @@ public class ContentBundle extends ContentItem {
* This method does not do language negotiation,
* it only returns an exact match for the given Locale or
* null if no such match is found.
- *
+ *
+ * It will try to return a language independent version of the
+ * content item, if there is one and {@code allowLanguageIndependent}
+ * is true.
+ *
* @param language the language for which to get an instance
* @return the instance of this item which exactly matches the
* language part of the Locale l
@@ -295,6 +308,10 @@ public class ContentBundle extends ContentItem {
* @pre language != null
*/
public final ContentItem getInstance(final String language) {
+ return this.getInstance(language, false);
+ }
+
+ public final ContentItem getInstance(final String language, boolean allowLanguageIndependent) {
if (Assert.isEnabled()) {
Assert.exists(language, String.class);
Assert.isTrue(language.length() == 2,
@@ -302,43 +319,28 @@ public class ContentBundle extends ContentItem {
+ "code");
}
+ // The data object to return
+ ContentItem contentItem = null;
+
+ // Try to get the content item in the exact language
DataAssociationCursor instances = instances();
instances.addEqualsFilter(LANGUAGE, language);
- DataObject dataObject = null;
-
if (instances.next()) {
- final DataObject data = instances.getDataObject();
-
- if (Assert.isEnabled()) {
- //Assert.isFalse(instances.next(),
- // "There is more than one instance with the " +
- // "same language");
- }
-
- instances.close();
-
- return (ContentItem) DomainObjectFactory.newInstance(data);
- } else {
-
- instances.close();
-
- // Look for language invariant version
- instances = instances();
- instances.addEqualsFilter(LANGUAGE, "--");
-
- if (instances.next()) {
- final DataObject data = instances.getDataObject();
-
- instances.close();
-
- return (ContentItem) DomainObjectFactory.newInstance(data);
- } else {
- instances.close();
- }
-
- return null;
+ contentItem = (ContentItem) DomainObjectFactory.newInstance(instances.getDataObject());
+ ;
}
+
+ instances.close();
+
+ // Try to get a language independent version of the content item,
+ // if we couldn't find an exact match and language independent
+ // content items are acceptable.
+ if (contentItem == null && allowLanguageIndependent == true) {
+ contentItem = this.getInstance("--", false);
+ }
+
+ return contentItem;
}
/**
@@ -366,19 +368,33 @@ public class ContentBundle extends ContentItem {
* @see ContentItem#getLanguage()
*/
public final boolean hasInstance(final String language) {
+ return this.hasInstance(language, false);
+ }
+
+ public final boolean hasInstance(final String language, boolean allowLanguageIndependent) {
if (Assert.isEnabled()) {
Assert.exists(language, String.class);
Assert.isTrue(language.length() == 2,
language + " is not an ISO639 language code");
}
+ boolean retVal = false;
+
final DataAssociationCursor instances = instances();
-// instances.addEqualsFilter(LANGUAGE, language);
- FilterFactory ff = instances.getFilterFactory();
- Filter filter = ff.or().
- addFilter(ff.equals("language", language)).
- addFilter(ff.equals("language", "--"));
- instances.addFilter(filter);
+
+ // If allowLanguageIndependent == false (default case), only search
+ // for an exact language match
+ if (allowLanguageIndependent == false) {
+ instances.addEqualsFilter(LANGUAGE, language);
+ } // Else, search also for language independent version
+ else {
+
+ FilterFactory ff = instances.getFilterFactory();
+ instances.addFilter(
+ ff.or().addFilter(ff.equals(LANGUAGE, language)).
+ addFilter(ff.equals(LANGUAGE, "--")));
+ }
+
return !instances.isEmpty();
}
@@ -420,9 +436,13 @@ public class ContentBundle extends ContentItem {
* if there is no language instance for any of the locales in
* locales
* @pre locales != null
+ * @deprecated Locale negotiation takes place in
+ * {@link com.arsdigita.globalization.GlobalizationHelper}.
+ * Use {@link #getInstance(java.lang.String)} instead.
*/
// Quasimodo:
// Is this method ever used? Netbeans couldn't find anything.
+ @Deprecated
public ContentItem negotiate(Locale[] locales) {
Assert.exists(locales);
String supportedLanguages = LanguageUtil.getSupportedLanguages();
@@ -445,7 +465,7 @@ public class ContentBundle extends ContentItem {
}
if (language != null) {
- // If the current object is languange invariant and no better
+ // If the current object is languange independent and no better
// match is already found, match it with the lowest priority
if (language.equals("--") && matchingInstance == null) {
bestMatch = locales.length;
@@ -490,7 +510,11 @@ public class ContentBundle extends ContentItem {
* @return the negotiated language instance or null if there
* is no language instance for any of the locales in locales.
* @pre locales != null
+ * @deprecated Locale negotiation takes place in
+ * {@link com.arsdigita.globalization.GlobalizationHelper}.
+ * Use {@link #getInstance(java.lang.String)} instead.
*/
+ @Deprecated
public ContentItem negotiate(Enumeration locales) {
String supportedLanguages = LanguageUtil.getSupportedLanguages();
@@ -514,7 +538,7 @@ public class ContentBundle extends ContentItem {
}
}
- // Add unspecified language for language invariant objects
+ // Add unspecified language for language independent objects
if (supportedLanguages.contains("--")) {
languageCodes.add("--");
}
diff --git a/ccm-cms/src/com/arsdigita/cms/ContentItemXMLRenderer.java b/ccm-cms/src/com/arsdigita/cms/ContentItemXMLRenderer.java
index 9b73e1366..e0ca5934d 100644
--- a/ccm-cms/src/com/arsdigita/cms/ContentItemXMLRenderer.java
+++ b/ccm-cms/src/com/arsdigita/cms/ContentItemXMLRenderer.java
@@ -53,8 +53,8 @@ public class ContentItemXMLRenderer extends DomainObjectXMLRenderer {
if (nObj instanceof ContentBundle) {
- nObj = ((ContentBundle) obj).negotiate(DispatcherHelper.getRequest().
- getLocales());
+ nObj = ((ContentBundle) obj).
+ getInstance(GlobalizationHelper.getNegotiatedLocale(), true);
}
super.walk(adapter, nObj, path, context, linkObject);
diff --git a/ccm-cms/src/com/arsdigita/cms/CustomizableContentItemXMLRenderer.java b/ccm-cms/src/com/arsdigita/cms/CustomizableContentItemXMLRenderer.java
index fdad253c9..d1fe35d0f 100644
--- a/ccm-cms/src/com/arsdigita/cms/CustomizableContentItemXMLRenderer.java
+++ b/ccm-cms/src/com/arsdigita/cms/CustomizableContentItemXMLRenderer.java
@@ -24,6 +24,7 @@ import com.arsdigita.domain.DomainObject;
import com.arsdigita.domain.DomainObjectFactory;
import com.arsdigita.domain.DomainObjectTraversalAdapter;
import com.arsdigita.domain.DomainObjectXMLRenderer;
+import com.arsdigita.globalization.GlobalizationHelper;
import com.arsdigita.kernel.ACSObject;
import com.arsdigita.persistence.DataAssociation;
import com.arsdigita.persistence.DataAssociationCursor;
@@ -128,8 +129,8 @@ public class CustomizableContentItemXMLRenderer
if (nObj instanceof ContentBundle) {
- nObj = ((ContentBundle) obj).negotiate(DispatcherHelper.getRequest().
- getLocales());
+ nObj = ((ContentBundle) obj).
+ getInstance(GlobalizationHelper.getNegotiatedLocale(), true);
}
diff --git a/ccm-cms/src/com/arsdigita/cms/contenttypes/Link.java b/ccm-cms/src/com/arsdigita/cms/contenttypes/Link.java
index 2987dac7a..70f8b70b1 100755
--- a/ccm-cms/src/com/arsdigita/cms/contenttypes/Link.java
+++ b/ccm-cms/src/com/arsdigita/cms/contenttypes/Link.java
@@ -26,6 +26,7 @@ import com.arsdigita.cms.dispatcher.ItemResolver;
import com.arsdigita.dispatcher.DispatcherHelper;
import com.arsdigita.domain.DataObjectNotFoundException;
import com.arsdigita.domain.DomainObjectFactory;
+import com.arsdigita.globalization.GlobalizationHelper;
import com.arsdigita.kernel.ACSObject;
import com.arsdigita.persistence.DataObject;
import com.arsdigita.persistence.DataOperation;
@@ -213,8 +214,8 @@ public class Link extends ACSObject {
if (DispatcherHelper.getRequest() == null) {
ci = ((ContentBundle) acsObject).getPrimaryInstance();
} else {
- ci = ((ContentBundle) acsObject).negotiate(DispatcherHelper.
- getRequest().getLocales());
+ ci = ((ContentBundle) acsObject).
+ getInstance(GlobalizationHelper.getNegotiatedLocale(), true);
}
} else {
// else there are no language versions so just use the acsObject
diff --git a/ccm-cms/src/com/arsdigita/cms/contenttypes/LinkTraversalAdapter.java b/ccm-cms/src/com/arsdigita/cms/contenttypes/LinkTraversalAdapter.java
index 1d9605f02..0679294e6 100644
--- a/ccm-cms/src/com/arsdigita/cms/contenttypes/LinkTraversalAdapter.java
+++ b/ccm-cms/src/com/arsdigita/cms/contenttypes/LinkTraversalAdapter.java
@@ -19,11 +19,11 @@
package com.arsdigita.cms.contenttypes;
import com.arsdigita.cms.ContentBundle;
-import com.arsdigita.dispatcher.DispatcherHelper;
import org.apache.log4j.Logger;
import com.arsdigita.persistence.metadata.Property;
import com.arsdigita.domain.SimpleDomainObjectTraversalAdapter;
import com.arsdigita.domain.DomainObject;
+import com.arsdigita.globalization.GlobalizationHelper;
/**
* An adapter for Links allowing pluggable
@@ -66,8 +66,8 @@ public class LinkTraversalAdapter
s_log.debug(
"Found a link to a content bundle. Resolve this link to negotiated language.");
- nObj = ((ContentBundle) obj).negotiate(DispatcherHelper.getRequest().
- getLocales());
+ nObj = ((ContentBundle) obj).
+ getInstance(GlobalizationHelper.getNegotiatedLocale(), true);
}
return super.processProperty(nObj, path, prop, context);
diff --git a/ccm-ldn-navigation/src/com/arsdigita/london/navigation/ui/ContentList.java b/ccm-ldn-navigation/src/com/arsdigita/london/navigation/ui/ContentList.java
index f6058a8f9..6cad12fa3 100755
--- a/ccm-ldn-navigation/src/com/arsdigita/london/navigation/ui/ContentList.java
+++ b/ccm-ldn-navigation/src/com/arsdigita/london/navigation/ui/ContentList.java
@@ -26,6 +26,7 @@ import com.arsdigita.cms.ContentItem;
import com.arsdigita.cms.dispatcher.SimpleXMLGenerator;
import com.arsdigita.dispatcher.DispatcherHelper;
import com.arsdigita.cms.ContentItemXMLRenderer;
+import com.arsdigita.globalization.GlobalizationHelper;
import com.arsdigita.kernel.ACSObject;
import com.arsdigita.persistence.OID;
import com.arsdigita.xml.Element;
@@ -140,7 +141,8 @@ public class ContentList extends AbstractComponent {
/*Fix by Quasimodo*/
/* getPrimaryInstance doesn't negotiate the language of the content item */
/* ContentItem cIndexItem = ((ContentBundle) indexItem).getPrimaryInstance().getLiveVersion(); */
- ContentItem cItem = ((ContentBundle) indexItem).negotiate(request.getLocales());
+ ContentItem cItem = ((ContentBundle) indexItem).
+ getInstance(GlobalizationHelper.getNegotiatedLocale(), true);
// If there is no matching language version for this content item
if(cItem == null) {
// get the primary instance instead (fallback)
@@ -176,7 +178,8 @@ public class ContentList extends AbstractComponent {
/*Fix by Quasimodo*/
/* getPrimaryInstance doesn't negotiate the language of the content item */
/* ContentItem cIndexItem = ((ContentBundle) indexItem).getPrimaryInstance().getLiveVersion(); */
- ContentItem cItem = ((ContentBundle) indexItem).negotiate(request.getLocales());
+ ContentItem cItem = ((ContentBundle) indexItem).
+ getInstance(GlobalizationHelper.getNegotiatedLocale(), true);
// If there is no matching language version for this content item
if(cItem == null) {
// get the primary instance instead (fallback)
@@ -264,7 +267,8 @@ public class ContentList extends AbstractComponent {
/*Fix by Quasimodo*/
/* getPrimaryInstance doesn't negotiate the language of the content item */
/* item = ((ContentBundle) item).getPrimaryInstance(); */
- item = ((ContentBundle) item).negotiate(DispatcherHelper.getRequest().getLocales());
+ item = ((ContentBundle) item).
+ getInstance(GlobalizationHelper.getNegotiatedLocale(), true);
// If there is no matching language version for this content item
if(item == null) {
// get the primary instance instead (fallback)
diff --git a/ccm-ldn-navigation/src/com/arsdigita/london/navigation/ui/GreetingItemExtraXML.java b/ccm-ldn-navigation/src/com/arsdigita/london/navigation/ui/GreetingItemExtraXML.java
index ca76c5579..2b4418469 100755
--- a/ccm-ldn-navigation/src/com/arsdigita/london/navigation/ui/GreetingItemExtraXML.java
+++ b/ccm-ldn-navigation/src/com/arsdigita/london/navigation/ui/GreetingItemExtraXML.java
@@ -21,7 +21,7 @@ import com.arsdigita.cms.ContentBundle;
import com.arsdigita.cms.ContentItem;
import com.arsdigita.cms.CMSConfig;
import com.arsdigita.cms.ExtraXMLGenerator;
-import com.arsdigita.dispatcher.DispatcherHelper;
+import com.arsdigita.globalization.GlobalizationHelper;
import com.arsdigita.london.navigation.Navigation;
import com.arsdigita.xml.Element;
@@ -111,7 +111,8 @@ public class GreetingItemExtraXML extends AbstractComponent {
/*Fix by Quasimodo*/
/* getPrimaryInstance doesn't negotiate the language of the content item */
/* ContentItem baseItem = bundle.getPrimaryInstance(); */
- ContentItem baseItem = bundle.negotiate(DispatcherHelper.getRequest().getLocales());
+ ContentItem baseItem = bundle.
+ getInstance(GlobalizationHelper.getNegotiatedLocale(), true);
// If there is no matching language version for this content item
if(baseItem == null) {
// get the primary instance instead (fallback)
diff --git a/ccm-ldn-navigation/src/com/arsdigita/london/navigation/ui/NavigationRootIndexItem.java b/ccm-ldn-navigation/src/com/arsdigita/london/navigation/ui/NavigationRootIndexItem.java
index bcc40aa1f..ac2762836 100755
--- a/ccm-ldn-navigation/src/com/arsdigita/london/navigation/ui/NavigationRootIndexItem.java
+++ b/ccm-ldn-navigation/src/com/arsdigita/london/navigation/ui/NavigationRootIndexItem.java
@@ -23,6 +23,7 @@ import com.arsdigita.cms.ContentBundle;
import com.arsdigita.cms.ContentItem;
import com.arsdigita.cms.ContentItemXMLRenderer;
import com.arsdigita.cms.dispatcher.SimpleXMLGenerator;
+import com.arsdigita.globalization.GlobalizationHelper;
import com.arsdigita.london.navigation.Navigation;
import com.arsdigita.xml.Element;
@@ -65,7 +66,9 @@ public class NavigationRootIndexItem extends AbstractComponent {
/*Fix by Quasimodo*/
/* getPrimaryInstance doesn't negotiate the language of the content item */
/* ContentItem indexItem = ((ContentBundle) Navigation.getConfig().getDefaultCategoryRoot().getIndexObject()).getPrimaryInstance().getLiveVersion(); */
- ContentItem indexItem = ((ContentBundle) Navigation.getConfig().getDefaultCategoryRoot().getIndexObject()).negotiate(request.getLocales());
+ ContentItem indexItem = ((ContentBundle) Navigation.getConfig().
+ getDefaultCategoryRoot().getIndexObject()).
+ getInstance(GlobalizationHelper.getNegotiatedLocale(), true);
// if there is no matching language version for this content item
if(indexItem == null) {
// get the primary instance instead (fallback)
diff --git a/ccm-ldn-navigation/src/com/arsdigita/london/navigation/ui/RelatedItems.java b/ccm-ldn-navigation/src/com/arsdigita/london/navigation/ui/RelatedItems.java
index c9c4dce00..d18b7574f 100755
--- a/ccm-ldn-navigation/src/com/arsdigita/london/navigation/ui/RelatedItems.java
+++ b/ccm-ldn-navigation/src/com/arsdigita/london/navigation/ui/RelatedItems.java
@@ -23,6 +23,7 @@ import com.arsdigita.london.navigation.RelatedItemsQueryFactory;
import com.arsdigita.cms.ContentBundle;
import com.arsdigita.cms.ContentItem;
import com.arsdigita.cms.ContentPage;
+import com.arsdigita.globalization.GlobalizationHelper;
import com.arsdigita.kernel.ACSObject;
import com.arsdigita.persistence.OID;
import com.arsdigita.xml.Element;
@@ -66,7 +67,8 @@ public class RelatedItems extends AbstractComponent {
/*Fix by Quasimodo*/
/* getPrimaryInstance doesn't negotiate the language of the content item */
/* obj = ((ContentBundle) obj).getPrimaryInstance(); */
- ContentItem cItem = ((ContentBundle) obj).negotiate(request.getLocales());
+ ContentItem cItem = ((ContentBundle) obj).
+ getInstance(GlobalizationHelper.getNegotiatedLocale(), true);
// if there is no matching language version of the content item
if(cItem == null) {
// get the primary instance instead (fallback)