All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.opencms.i18n.CmsLocaleGroup Maven / Gradle / Ivy

/*
 * This library is part of OpenCms -
 * the Open Source Content Management System
 *
 * Copyright (c) Alkacon Software GmbH & Co. KG (http://www.alkacon.com)
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * For further information about Alkacon Software, please see the
 * company website: http://www.alkacon.com
 *
 * For further information about OpenCms, please see the
 * project website: http://www.opencms.org
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

package org.opencms.i18n;

import org.opencms.file.CmsObject;
import org.opencms.file.CmsProperty;
import org.opencms.file.CmsPropertyDefinition;
import org.opencms.file.CmsResource;
import org.opencms.main.CmsException;
import org.opencms.main.CmsLog;
import org.opencms.main.OpenCms;
import org.opencms.site.CmsSite;

import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;

import org.apache.commons.logging.Log;

import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Multimap;
import com.google.common.collect.Sets;

/**
 * Represents a group of resources which are locale variants of each other.

*/ public class CmsLocaleGroup { /** The logger instance for this class. */ private static final Log LOG = CmsLog.getLog(CmsLocaleGroup.class); /** The CMS context to use. */ private CmsObject m_cms; /** The locale cache. */ private Map m_localeCache = Maps.newHashMap(); /** The 'no translation' setting for this locale group. */ private String m_noTranslation; /** The primary resource. */ private CmsResource m_primaryResource; /** Map of resources by locale. */ private Multimap m_resourcesByLocale = ArrayListMultimap.create(); /** The secondary resources. */ private Set m_secondaryResources; /** * Creates a new instance.

* * @param cms the CMS context to use * @param primaryResource the primary resource * @param secondaryResources the secondary resources */ public CmsLocaleGroup(CmsObject cms, CmsResource primaryResource, List secondaryResources) { m_primaryResource = primaryResource; m_secondaryResources = Sets.newHashSet(secondaryResources); m_cms = cms; initLocales(); } /** * Gets the list of all resources of this group (primary and secondary).

* * @return the list of all resources of this group */ public List getAllResources() { List result = Lists.newArrayList(); result.add(m_primaryResource); for (CmsResource res : getSecondaryResources()) { result.add(res); } return result; } /** * Gets the main locale (i.e. the locale of the primary resource of this group).

* * @return the main locale */ public Locale getMainLocale() { return m_localeCache.get(m_primaryResource); } /** * Gets the primary resource.

* * @return the primary resource */ public CmsResource getPrimaryResource() { return m_primaryResource; } /** * Gets a map which contains the resources of the locale group as keys, indexed by their locale.

* * If the locale group contains more than one resource from the same locale,, which one is used a map value is undefined. * * @return the map of resources by locale */ public Map getResourcesByLocale() { List resources = Lists.newArrayList(); resources.add(m_primaryResource); resources.addAll(m_secondaryResources); Collections.sort(resources, new Comparator() { public int compare(CmsResource arg0, CmsResource arg1) { String path1 = arg0.getRootPath(); String path2 = arg1.getRootPath(); return path2.compareTo(path1); } }); Map result = new LinkedHashMap(); for (CmsResource resource : resources) { result.put(m_localeCache.get(resource), resource); } return result; } /** * Gets the resources of this group which have the given locale.

* * @param locale a locale * @return the collection of resources with the given locale */ public Collection getResourcesForLocale(Locale locale) { return Lists.newArrayList(m_resourcesByLocale.get(locale)); } /** * Gets the secondary resources of this group.

* * @return the collection of secondary resources */ public Set getSecondaryResources() { return Collections.unmodifiableSet(m_secondaryResources); } /** * Checks if this group has a resource with the given locale.

* * @param locale the locale * @return true if the group has a resource with the locale */ public boolean hasLocale(Locale locale) { return m_resourcesByLocale.containsKey(locale); } /** * Checks if the locale group is marked as not translatable for the given locale.

* * @param locale a locale * * @return true if the locale group is marked as not translatable for the given locale */ public boolean isMarkedNoTranslation(Locale locale) { return (m_noTranslation != null) && CmsLocaleManager.getLocales(m_noTranslation).contains(locale); } /** * Checks if the locale group is marked as not translatable for any of the given locales.

* * @param locales a set of locales * @return true if the locale group is marked as not translatable for any of the given resources */ public boolean isMarkedNoTranslation(Set locales) { if (m_noTranslation == null) { return false; } List noTranslationLocales = CmsLocaleManager.getLocales(m_noTranslation); for (Locale locale : noTranslationLocales) { if (locales.contains(locale)) { return true; } } return false; } /** * Returns true if this is a potential group head, i.e. the locale of the primary resource is the main translation locale configured for the site * in which it is located.

* * @return true if this is a potential group head */ public boolean isPotentialGroupHead() { CmsSite site = OpenCms.getSiteManager().getSiteForRootPath(m_primaryResource.getRootPath()); if (site == null) { return false; } Locale mainLocale = site.getMainTranslationLocale(null); if (mainLocale == null) { return false; } Locale primaryLocale = getMainLocale(); return mainLocale.equals(primaryLocale); } /** * Checks if this group is a real group, i.e. consists of more than one resource.

* * @return true if this is a real group */ public boolean isRealGroup() { return m_secondaryResources.size() > 0; } /** * Checks if this is either a real group or a potential group head (i.e. a potential primary resource).

* * @return true if this is a real group or a potential group head */ public boolean isRealGroupOrPotentialGroupHead() { return isRealGroup() || isPotentialGroupHead(); } /** * Gets the locales of the resources from this locale group.

* * @return the locales of this locale group */ Set getLocales() { return Sets.newHashSet(getResourcesByLocale().keySet()); } /** * Initializes the locales.

* */ private void initLocales() { if (!m_localeCache.isEmpty()) { return; } readLocale(m_primaryResource); for (CmsResource resource : m_secondaryResources) { readLocale(resource); } for (Map.Entry entry : m_localeCache.entrySet()) { CmsResource key = entry.getKey(); Locale value = entry.getValue(); m_resourcesByLocale.put(value, key); } try { CmsProperty noTranslationProp = m_cms.readPropertyObject( m_primaryResource, CmsPropertyDefinition.PROPERTY_LOCALE_NOTRANSLATION, false); m_noTranslation = noTranslationProp.getValue(); } catch (CmsException e) { LOG.error(e.getLocalizedMessage(), e); } } /** * Reads the locale for the given resource.

* * @param res the locale for the resource */ private void readLocale(CmsResource res) { Locale locale = OpenCms.getLocaleManager().getDefaultLocale(m_cms, res); m_localeCache.put(res, locale); } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy