diff options
Diffstat (limited to 'bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/IUPropertyUtils.java')
-rw-r--r-- | bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/IUPropertyUtils.java | 241 |
1 files changed, 0 insertions, 241 deletions
diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/IUPropertyUtils.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/IUPropertyUtils.java deleted file mode 100644 index 9007b3ee7..000000000 --- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/IUPropertyUtils.java +++ /dev/null @@ -1,241 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008-2009 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - * EclipseSource - ongoing development - *******************************************************************************/ -package org.eclipse.equinox.internal.provisional.p2.ui; - -import java.lang.ref.SoftReference; -import java.util.*; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.Status; -import org.eclipse.equinox.internal.p2.core.helpers.LogHelper; -import org.eclipse.equinox.internal.p2.core.helpers.ServiceHelper; -import org.eclipse.equinox.internal.p2.metadata.InstallableUnit; -import org.eclipse.equinox.internal.p2.ui.ProvUIActivator; -import org.eclipse.equinox.internal.provisional.p2.engine.IProfile; -import org.eclipse.equinox.internal.provisional.p2.engine.IProfileRegistry; -import org.eclipse.equinox.internal.provisional.p2.metadata.*; -import org.eclipse.equinox.internal.provisional.p2.metadata.query.Collector; -import org.eclipse.equinox.internal.provisional.p2.metadata.query.IUPropertyQuery; - -public class IUPropertyUtils { - - // TODO: these constants should come from API, eg. IInstallableUnit or ??? - static final Locale DEFAULT_LOCALE = new Locale("df", "LT"); //$NON-NLS-1$//$NON-NLS-2$ - static final String NAMESPACE_IU_LOCALIZATION = "org.eclipse.equinox.p2.localization"; //$NON-NLS-1$ - - // Cache the IU fragments that provide localizations for a given locale. - // map: locale => soft reference to a collector - private static Map LocaleCollectorCache = new HashMap(2); - - // Get the license in the default locale. - public static ILicense getLicense(IInstallableUnit iu) { - return getLicense(iu, getCurrentLocale()); - } - - // Get the copyright in the default locale. - public static ICopyright getCopyright(IInstallableUnit iu) { - return getCopyright(iu, getCurrentLocale()); - } - - // Get a property in the default locale - public static String getIUProperty(IInstallableUnit iu, String propertyKey) { - return getIUProperty(iu, propertyKey, getCurrentLocale()); - } - - public static ILicense getLicense(IInstallableUnit iu, Locale locale) { - ILicense license = iu.getLicense(); - String body = (license != null ? license.getBody() : null); - if (body == null || body.length() <= 1 || body.charAt(0) != '%') - return license; - final String actualKey = body.substring(1); // Strip off the % - body = getLocalizedIUProperty(iu, actualKey, locale); - return MetadataFactory.createLicense(license.getLocation(), body); - } - - public static ICopyright getCopyright(IInstallableUnit iu, Locale locale) { - ICopyright copyright = iu.getCopyright(); - String body = (copyright != null ? copyright.getBody() : null); - if (body == null || body.length() <= 1 || body.charAt(0) != '%') - return copyright; - final String actualKey = body.substring(1); // Strip off the % - body = getLocalizedIUProperty(iu, actualKey, locale); - return MetadataFactory.createCopyright(copyright.getLocation(), body); - } - - public static String getIUProperty(IInstallableUnit iu, String propertyKey, Locale locale) { - String value = iu.getProperty(propertyKey); - if (value == null || value.length() <= 1 || value.charAt(0) != '%') - return value; - // else have a localizable property - final String actualKey = value.substring(1); // Strip off the % - return getLocalizedIUProperty(iu, actualKey, locale); - } - - private static String getLocalizedIUProperty(IInstallableUnit iu, String actualKey, Locale locale) { - String localizedKey = makeLocalizedKey(actualKey, locale.toString()); - String localizedValue = null; - - //first check for a cached localized value - if (iu instanceof InstallableUnit) - localizedValue = ((InstallableUnit) iu).getLocalizedProperty(localizedKey); - //next check if the localized value is stored in the same IU (common case) - if (localizedValue == null) - localizedValue = iu.getProperty(localizedKey); - if (localizedValue != null) - return localizedValue; - - final List locales = buildLocaleVariants(locale); - final IInstallableUnit theUnit = iu; - - Collector localizationFragments = getLocalizationFragments(locale, locales); - - Collector hostLocalizationCollector = new Collector() { - public boolean accept(Object object) { - boolean haveHost = false; - if (object instanceof IInstallableUnitFragment) { - IInstallableUnitFragment fragment = (IInstallableUnitFragment) object; - IRequiredCapability[] hosts = fragment.getHost(); - for (int i = 0; i < hosts.length; i++) { - IRequiredCapability nextHost = hosts[i]; - if (IInstallableUnit.NAMESPACE_IU_ID.equals(nextHost.getNamespace()) && // - theUnit.getId().equals(nextHost.getName()) && // - nextHost.getRange() != null && // - nextHost.getRange().isIncluded(theUnit.getVersion())) { - haveHost = true; - break; - } - } - } - return (haveHost ? super.accept(object) : true); - } - }; - - IUPropertyQuery iuQuery = new IUPropertyQuery(IInstallableUnit.PROP_TYPE_FRAGMENT, "true"); //$NON-NLS-1$ - Collector collected = iuQuery.perform(localizationFragments.iterator(), hostLocalizationCollector); - - if (!collected.isEmpty()) { - String translation = null; - for (Iterator iter = collected.iterator(); iter.hasNext() && translation == null;) { - IInstallableUnit localizationIU = (IInstallableUnit) iter.next(); - for (Iterator jter = locales.iterator(); jter.hasNext();) { - String localeKey = makeLocalizedKey(actualKey, (String) jter.next()); - translation = localizationIU.getProperty(localeKey); - if (translation != null) - return cacheResult(iu, localizedKey, translation); - } - } - } - - for (Iterator iter = locales.iterator(); iter.hasNext();) { - String nextLocale = (String) iter.next(); - String localeKey = makeLocalizedKey(actualKey, nextLocale); - String nextValue = iu.getProperty(localeKey); - if (nextValue != null) - return cacheResult(iu, localizedKey, nextValue); - } - - return cacheResult(iu, localizedKey, actualKey); - } - - /** - * Cache the translated property value to optimize future retrieval of the same value. - * Currently we just cache on the installable unit object in memory. In future - * we should push support for localized property retrieval into IInstallableUnit - * so we aren't required to reach around the API here. - */ - private static String cacheResult(IInstallableUnit iu, String localizedKey, String localizedValue) { - if (iu instanceof InstallableUnit) - ((InstallableUnit) iu).setLocalizedProperty(localizedKey, localizedValue); - return localizedValue; - } - - /** - * Collects the installable unit fragments that contain locale data for the given locales. - */ - private static synchronized Collector getLocalizationFragments(Locale locale, List localeVariants) { - SoftReference collectorRef = (SoftReference) LocaleCollectorCache.get(locale); - if (collectorRef != null) { - Collector cached = (Collector) collectorRef.get(); - if (cached != null) - return cached; - } - - final List locales = localeVariants; - - Collector localeFragmentCollector = new Collector() { - public boolean accept(Object object) { - boolean haveLocale = false; - if (object instanceof IInstallableUnitFragment) { - IInstallableUnitFragment fragment = (IInstallableUnitFragment) object; - IProvidedCapability[] provides = fragment.getProvidedCapabilities(); - for (int j = 0; j < provides.length && !haveLocale; j++) { - IProvidedCapability nextProvide = provides[j]; - if (NAMESPACE_IU_LOCALIZATION.equals(nextProvide.getNamespace())) { - String providedLocale = nextProvide.getName(); - if (providedLocale != null) { - for (Iterator iter = locales.iterator(); iter.hasNext();) { - if (providedLocale.equals(iter.next())) { - haveLocale = true; - break; - } - } - } - } - } - } - return (haveLocale ? super.accept(object) : true); - } - }; - - //Due to performance problems we restrict locale lookup to the current profile (see bug 233958) - IProfileRegistry profileRegistry = (IProfileRegistry) ServiceHelper.getService(ProvUIActivator.getContext(), IProfileRegistry.class.getName()); - if (profileRegistry == null) { - LogHelper.log(new Status(IStatus.ERROR, ProvUIActivator.PLUGIN_ID, "Profile registry unavailable. Default language will be used.", new RuntimeException())); //$NON-NLS-1$ - return new Collector(); - } - IProfile profile = profileRegistry.getProfile(IProfileRegistry.SELF); - if (profile == null) { - LogHelper.log(new Status(IStatus.ERROR, ProvUIActivator.PLUGIN_ID, "Profile unavailable. Default language will be used.", new RuntimeException())); //$NON-NLS-1$ - return new Collector(); - } - IUPropertyQuery iuQuery = new IUPropertyQuery(IInstallableUnit.PROP_TYPE_FRAGMENT, "true"); //$NON-NLS-1$ - Collector collected = profile.query(iuQuery, localeFragmentCollector, null); - LocaleCollectorCache.put(locale, new SoftReference(collected)); - return collected; - } - - /** - */ - private static List buildLocaleVariants(Locale locale) { - String nl = locale.toString(); - ArrayList result = new ArrayList(4); - int lastSeparator; - while (true) { - result.add(nl); - lastSeparator = nl.lastIndexOf('_'); - if (lastSeparator == -1) - break; - nl = nl.substring(0, lastSeparator); - } - // Add the default locale (most general) - result.add(DEFAULT_LOCALE.toString()); - return result; - } - - private static String makeLocalizedKey(String actualKey, String localeImage) { - return localeImage + '.' + actualKey; - } - - private static Locale getCurrentLocale() { - return Locale.getDefault(); - } - -} |