| /** |
| * Copyright (c) 2011, 2015 - Lunifera GmbH (Gross Enzersdorf, Austria), Loetz GmbH&Co.KG (69115 Heidelberg, Germany) |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License 2.0 |
| * which accompanies this distribution, and is available at |
| * https://www.eclipse.org/legal/epl-2.0/ |
| * |
| * SPDX-License-Identifier: EPL-2.0 |
| * |
| * Contributors: |
| * Florian Pirchner - Initial implementation |
| */ |
| package org.eclipse.osbp.ide.core.api.i18n; |
| |
| import java.util.ArrayList; |
| import java.util.Collections; |
| import java.util.HashMap; |
| import java.util.HashSet; |
| import java.util.Iterator; |
| import java.util.List; |
| import java.util.Locale; |
| import java.util.Map; |
| import java.util.Properties; |
| import java.util.Set; |
| |
| import org.eclipse.core.resources.IProject; |
| import org.eclipse.core.runtime.IPath; |
| |
| // TODO: Auto-generated Javadoc |
| /** |
| * Caches the I18n keys and their values based in {@link IProject workspace |
| * proejcts}. |
| */ |
| public interface II18nRegistry { |
| |
| /** |
| * Returns the translated value for the given project, locale and key. |
| * |
| * @param project |
| * the project |
| * @param locale |
| * the locale |
| * @param key |
| * the key |
| * @return the text |
| */ |
| String getText(IProject project, Locale locale, String key); |
| |
| /** |
| * Returns a list of proposals. If the searchValue matches parts of the |
| * value or the key for an i18n record, it is added to the list of |
| * proposals. Must never return <code>null</code>. |
| * |
| * @param project |
| * - The project which should be searched for matching I18n |
| * values. |
| * @param locale |
| * - The locale which should be used to search for matching I18n |
| * values. |
| * @param packageName |
| * - The package name. It can be used to search for I18n values, |
| * if the searchValue starts with ".". For instance |
| * ".SalesOrder". Then the matcher only looks for I18n Values |
| * with a key starting with the given package name.<br> |
| * Wildcards are allowed. For instance ".*Order". The matcher |
| * tries to find any possible combination. A "*" wildcard at the |
| * end of the searchValue will be added automatically by the |
| * matcher. |
| * @param searchValue |
| * the search value |
| * @return proposal - a List never <code>null</code> |
| */ |
| List<Proposal> findContentProposals(IProject project, Locale locale, |
| String packageName, String searchValue); |
| |
| /** |
| * Returns a list of proposals. The searchValue must match the entire key |
| * for an i18n record. |
| * |
| * @param project |
| * - The project which should be searched for matching I18n |
| * values. |
| * @param locale |
| * - The locale which should be used to search for matching I18n |
| * values. |
| * @param packageName |
| * - The package name. It can be used to search for I18n values, |
| * if the searchValue starts with ".". For instance |
| * ".SalesOrder". Then the matcher only looks for I18n Values |
| * with a key starting with the given package name.<br> |
| * Wildcards are allowed. For instance ".*Order". The matcher |
| * tries to find any possible combination. A "*" wildcard at the |
| * end of the searchValue will be added automatically by the |
| * matcher. |
| * @param key |
| * - The key to look for. |
| * @return proposal - a List never <code>null</code> |
| */ |
| List<Proposal> findStrictKeyMatchingProposals(IProject project, |
| Locale locale, String packageName, String key); |
| |
| /** |
| * Returns the best matching proposal. |
| * |
| * @param project |
| * - The project which should be searched for matching I18n |
| * values. |
| * @param locale |
| * - The locale which should be used to search for matching I18n |
| * values. |
| * @param packageName |
| * - The package name. It can be used to search for I18n values, |
| * if the searchValue starts with ".". For instance |
| * ".SalesOrder". Then the matcher only looks for I18n Values |
| * with a key starting with the given package name.<br> |
| * Wildcards are allowed. For instance ".*Order". The matcher |
| * tries to find any possible combination. A "*" wildcard at the |
| * end of the searchValue will be added automatically by the |
| * matcher. |
| * @param key |
| * - The key to look for. |
| * @return proposal - a List never <code>null</code> |
| */ |
| Proposal findBestMatch(IProject project, Locale locale, String packageName, |
| String key); |
| |
| /** |
| * Caches the ProjectDescription. |
| * |
| * @param description |
| * the description |
| */ |
| void cache(ProjectDescription description); |
| |
| /** |
| * Caches the ResourceDescription. |
| * |
| * @param description |
| * the description |
| */ |
| void cache(ResourceDescription description); |
| |
| /** |
| * Removes the given resource from the project description. |
| * |
| * @param project |
| * the project |
| * @param locale |
| * the locale |
| * @param location |
| * the location |
| */ |
| void removeResource(IProject project, Locale locale, IPath location); |
| |
| /** |
| * Removes the project from the cache. |
| * |
| * @param project |
| * the project |
| */ |
| void removeProject(IProject project); |
| |
| /** |
| * Returns all project descriptions. |
| * |
| * @return the project descriptions |
| */ |
| Set<ProjectDescription> getProjectDescriptions(); |
| |
| /** |
| * Contains all required information about a project. It contains all |
| * resources. |
| */ |
| public static class ProjectDescription { |
| |
| /** The resources. */ |
| private final Map<Locale, Set<ResourceDescription>> resources = Collections |
| .synchronizedMap(new HashMap<Locale, Set<ResourceDescription>>()); |
| |
| /** The project. */ |
| private final IProject project; |
| |
| /** |
| * Instantiates a new project description. |
| * |
| * @param project |
| * the project |
| */ |
| public ProjectDescription(IProject project) { |
| this.project = project; |
| } |
| |
| /** |
| * Gets the project. |
| * |
| * @return the project |
| */ |
| public IProject getProject() { |
| return project; |
| } |
| |
| /** |
| * Returns all resource descriptions contained in the project for the |
| * given locale. |
| * |
| * @param locale |
| * the locale |
| * @return the resource descriptions |
| */ |
| public List<ResourceDescription> getResourceDescriptions(Locale locale) { |
| List<ResourceDescription> result = new ArrayList<ResourceDescription>(); |
| collectByLocale(locale, result); |
| return result; |
| } |
| |
| /** |
| * Collect by locale. |
| * |
| * @param locale |
| * the locale |
| * @param result |
| * the result |
| * @return the resource description |
| */ |
| private ResourceDescription collectByLocale(Locale locale, |
| List<ResourceDescription> result) { |
| Set<ResourceDescription> descs = resources.get(locale); |
| if (descs != null) { |
| result.addAll(descs); |
| } |
| return null; |
| } |
| |
| /** |
| * Puts the list of resources into the resources map. |
| * |
| * @param key |
| * the key |
| * @param value |
| * the value |
| */ |
| public void putResources(Locale key, Set<ResourceDescription> value) { |
| resources.put(key, value); |
| } |
| |
| /** |
| * Puts a single resource into the resources map. |
| * |
| * @param value |
| * the value |
| */ |
| public void putResource(ResourceDescription value) { |
| |
| Set<ResourceDescription> descriptions = resources.get(value |
| .getLocale()); |
| if (descriptions == null) { |
| descriptions = new HashSet<II18nRegistry.ResourceDescription>(); |
| descriptions.add(value); |
| resources.put(value.getLocale(), descriptions); |
| } else { |
| // if the hash key of given value is contained in set, then |
| // remove it |
| descriptions.remove(value); |
| // and add it again |
| descriptions.add(value); |
| } |
| } |
| |
| /** |
| * Removes the given resource from the internal list of resources. |
| * |
| * @param value |
| * the value |
| */ |
| public void removeResource(ResourceDescription value) { |
| synchronized (resources) { |
| Locale locale = value.getLocale(); |
| IPath path = value.getPath(); |
| |
| removeResource(locale, path); |
| } |
| } |
| |
| /** |
| * Removes the resource for the given path. |
| * |
| * @param locale |
| * the locale |
| * @param location |
| * the location |
| */ |
| public void removeResource(Locale locale, IPath location) { |
| Set<ResourceDescription> descriptions = resources.get(locale); |
| for (Iterator<ResourceDescription> iterator = descriptions |
| .iterator(); iterator.hasNext();) { |
| ResourceDescription resourceDescription = iterator.next(); |
| if (resourceDescription.getPath().equals(location)) { |
| iterator.remove(); |
| break; |
| } |
| } |
| } |
| |
| /** |
| * Returns all resource descriptions. |
| * |
| * @return the resource descriptions |
| */ |
| public Set<ResourceDescription> getResourceDescriptions() { |
| Set<II18nRegistry.ResourceDescription> result = new HashSet<II18nRegistry.ResourceDescription>(); |
| for (Set<ResourceDescription> set : resources.values()) { |
| for (ResourceDescription desc : set) { |
| result.add(desc); |
| } |
| } |
| return result; |
| } |
| } |
| |
| /** |
| * A resource is a file containing all translations for a file. |
| */ |
| public static class ResourceDescription { |
| |
| /** The project. */ |
| private final IProject project; |
| |
| /** The locale. */ |
| private final Locale locale; |
| |
| /** The path. */ |
| private final IPath path; |
| |
| /** The properties. */ |
| private final Properties properties; |
| |
| /** |
| * Instantiates a new resource description. |
| * |
| * @param project |
| * the project |
| * @param locale |
| * the locale |
| * @param path |
| * the path |
| * @param properties |
| * the properties |
| */ |
| public ResourceDescription(IProject project, Locale locale, IPath path, |
| Properties properties) { |
| this.project = project; |
| this.locale = locale; |
| this.path = path; |
| this.properties = properties; |
| } |
| |
| /** |
| * Gets the project. |
| * |
| * @return the project |
| */ |
| public IProject getProject() { |
| return project; |
| } |
| |
| /** |
| * Gets the locale. |
| * |
| * @return the locale |
| */ |
| public Locale getLocale() { |
| return locale; |
| } |
| |
| /** |
| * Gets the path. |
| * |
| * @return the path |
| */ |
| public IPath getPath() { |
| return path; |
| } |
| |
| /** |
| * Gets the properties. |
| * |
| * @return the properties |
| */ |
| public Properties getProperties() { |
| return properties; |
| } |
| |
| /* (non-Javadoc) |
| * @see java.lang.Object#hashCode() |
| */ |
| @Override |
| public int hashCode() { |
| final int prime = 31; |
| int result = 1; |
| result = prime * result + ((path == null) ? 0 : path.hashCode()); |
| return result; |
| } |
| |
| /* (non-Javadoc) |
| * @see java.lang.Object#equals(java.lang.Object) |
| */ |
| @Override |
| public boolean equals(Object obj) { |
| if (this == obj) |
| return true; |
| if (obj == null) |
| return false; |
| if (getClass() != obj.getClass()) |
| return false; |
| ResourceDescription other = (ResourceDescription) obj; |
| if (path == null) { |
| if (other.path != null) |
| return false; |
| } else if (!path.equals(other.path)) |
| return false; |
| return true; |
| } |
| } |
| |
| /** |
| * The Class Proposal. |
| */ |
| public static class Proposal { |
| |
| /** The i18n key. */ |
| private final String i18nKey; |
| |
| /** The i18n value. */ |
| private final String i18nValue; |
| |
| /** The resource description. */ |
| private final ResourceDescription resourceDescription; |
| |
| /** The priority. */ |
| @SuppressWarnings("unused") |
| private final int priority; |
| |
| /** |
| * Instantiates a new proposal. |
| * |
| * @param i18nKey |
| * the i18n key |
| * @param i18nValue |
| * the i18n value |
| * @param resourceDescription |
| * the resource description |
| * @param priority |
| * the priority |
| */ |
| public Proposal(String i18nKey, String i18nValue, |
| ResourceDescription resourceDescription, int priority) { |
| super(); |
| this.i18nKey = i18nKey; |
| this.i18nValue = i18nValue; |
| this.resourceDescription = resourceDescription; |
| this.priority = priority; |
| } |
| |
| /** |
| * Returns the i18nKey. |
| * |
| * @return the i18n key |
| */ |
| public String getI18nKey() { |
| return i18nKey; |
| } |
| |
| /** |
| * Returns the i18nValue. |
| * |
| * @return the i18n value |
| */ |
| public String getI18nValue() { |
| return i18nValue; |
| } |
| |
| /** |
| * Returns the locale where key and value had been found. |
| * |
| * @return the locale |
| */ |
| public Locale getLocale() { |
| return resourceDescription.getLocale(); |
| } |
| |
| /** |
| * Returns the resource description, where the i18n entry was contained. |
| * |
| * @return the resource description |
| */ |
| public ResourceDescription getResourceDescription() { |
| return resourceDescription; |
| } |
| |
| } |
| } |