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)